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

Другие вопросы по тегам