Python разбивает парсинг json с символами \"
Я пытаюсь разобрать строку json с помощью escape-символа (в некотором роде, я думаю)
{
"publisher": "\"O'Reilly Media, Inc.\""
}
Парсер хорошо разбирает, если я удаляю персонажа \"
из строки,
исключения, поднятые различными парсерами,
JSON
File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 17 column 20 (char 392)
ujson
ValueError: Unexpected character in found when decoding object value
Как заставить парсер убежать от этих символов?
Обновить: пс. JSON импортируется как UJSON в этом примере
Это то, что показывает мой иде
запятая добавлена случайно, в конце json нет запятой, json действителен
определение строки.
2 ответа
Вы почти наверняка не определили правильно экранированные обратные слеши. Если вы правильно определили строку, JSON просто разберется:
>>> import json
>>> json_str = r'''
... {
... "publisher": "\"O'Reilly Media, Inc.\""
... }
... ''' # raw string to prevent the \" from being interpreted by Python
>>> json.loads(json_str)
{u'publisher': u'"O\'Reilly Media, Inc."'}
Обратите внимание, что я использовал необработанный строковый литерал для определения строки в Python; если бы я не сделал, то \"
будет интерпретироваться Python и обычным "
будет вставлен. В противном случае вам придется удвоить обратную косую черту:
>>> print '\"'
"
>>> print '\\"'
\"
>>> print r'\"'
\"
Повторное кодирование проанализированной структуры Python обратно в JSON показывает, что обратные слэши появляются вновь, с repr()
вывод для строки с использованием той же двойной обратной косой черты:
>>> json.dumps(json.loads(json_str))
'{"publisher": "\\"O\'Reilly Media, Inc.\\""}'
>>> print json.dumps(json.loads(json_str))
{"publisher": "\"O'Reilly Media, Inc.\""}
Если вы не избежали \
в противном случае вы получите неиспользованные кавычки:
>>> json_str_improper = '''
... {
... "publisher": "\"O'Reilly Media, Inc.\""
... }
... '''
>>> print json_str_improper
{
"publisher": ""O'Reilly Media, Inc.""
}
>>> json.loads(json_str_improper)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 3 column 20 (char 22)
Обратите внимание, что \"
последовательности теперь печатаются как "
обратный слеш ушел!
Ваш JSON недействителен. Если у вас есть вопросы о ваших объектах JSON, вы всегда можете проверить их с помощью JSONlint. В вашем случае у вас есть объект
{
"publisher": "\"O'Reilly Media, Inc.\"",
}
и у вас есть лишняя запятая, указывающая, что что-то еще должно прийти. Так что JSONlint дает
Ошибка разбора в строке 2: ...edia, Inc.\"", } ---------------------^ Ожидается 'STRING'
который начал бы помочь вам найти, где была ошибка.
Удаление запятой для
{
"publisher": "\"O'Reilly Media, Inc.\""
}
доходность
Действительный JSON
Обновление: я держу материал о JSONlint, так как это может быть полезно для других в будущем. Что касается вашего правильно сформированного объекта JSON, у меня есть
import json
d = {
"publisher": "\"O'Reilly Media, Inc.\""
}
print "Here is your string parsed."
print(json.dumps(d))
получая
Вот твоя строка разобрана. {"publisher": "\"O'Reilly Media, Inc.\""}
Процесс завершен с кодом выхода 0