Декодировать комплекс JSON в Python - PullRequest
5 голосов
/ 05 августа 2009

У меня есть объект JSON, созданный в PHP, этот объект JSON содержит еще одну экранированную строку JSON в одной из своих ячеек:

php > $insidejson = array('foo' => 'bar','foo1' => 'bar1');
php > $arr = array('a' => array('a1'=>json_encode($insidejson)));
php > echo json_encode($arr);
{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}

Затем, с Python, я пытаюсь деокодировать его с помощью simplejson:

>>> import simplejson as json
>>> json.loads('{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}')

Это происходит со следующей ошибкой:

Traceback (most recent call last):
  File "", line 1, in ?
  File "build/bdist.linux-i686/egg/simplejson/__init__.py", line 307, in loads
  File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 335, in decode
  File "build/bdist.linux-i686/egg/simplejson/decoder.py", line 351, in raw_decode
ValueError: Expecting , delimiter: line 1 column 14 (char 14)

Как я могу получить этот объект JSON, декодированный в Python? И PHP, и JS успешно его декодируют, и я не могу изменить его структуру, поскольку это потребует серьезных изменений во многих различных компонентах на разных языках.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 05 августа 2009

Попробуйте префикс вашей строки с 'r', чтобы сделать ее необработанной строкой:

# Python 2.6.2
>>> import json
>>> s = r'{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}'
>>> json.loads(s)
{u'a': {u'a1': u'{"foo":"bar","foo1":"bar1"}'}}

То, что Алекс говорит ниже, правда: вы можете просто удвоить косую черту. (Его ответ не был опубликован, когда я начал свой.) Я думаю, что использовать необработанные строки проще, хотя бы потому, что это языковая функция, которая означает то же самое, и ее сложнее ошибиться.

1 голос
/ 05 августа 2009

Если вы хотите вставить обратную косую черту в строку, им нужно экранировать себя.

import simplejson as json
json.loads('{"a":{"a1":"{\\"foo\\":\\"bar\\",\\"foo1\\":\\"bar1\\"}"}}')

Я протестировал его, и Python отлично справляется с этим вводом - за исключением того, что я использовал модуль json, включенный в стандартную библиотеку (import json, Python 3.1).

1 голос
/ 05 августа 2009

Попробуйте

Может быть, simplejson слишком "простой".

...