2009-08-04 2 views
5

У меня есть объект JSON, созданный в PHP, что объект JSON содержит другой спасся JSON строку в один из его клеток:Decode комплекс JSON в Python

 
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, я пытаюсь deocding его с помощью 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 реш oded в Python? И PHP, и JS успешно декодируют его, и я не могу изменить его структуру, так как это потребует значительных изменений во многих разных компонентах на разных языках.

Спасибо!

ответ

9

Try предваряя вашу строку с «г», чтобы сделать его сырец строку:

# 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"}'}} 

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

+0

это работает, спасибо! –

+0

Да, я согласен с hughdbbrown, я забыл о черновой функции Python. +1 –

1

Попробуйте

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

+1

«simplejson - это поддерживаемая внешними версиями версия библиотеки json, входящая в состав Python 2.6 и Python 3.0». –

1

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

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

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

+0

спасибо! этот тоже работает, но я предпочитаю использовать решение hughdbrown, так как он не требует никаких изменений в других компонентах. –

+0

Решения эквивалентны, но использование необработанной строки действительно выглядит аккуратно :) –