2009-08-04 12 views
5

Mam obiektu JSON utworzone w PHP, że obiekt JSON zawiera kolejny uciekł JSON ciąg w jednym z nich znajduje się w komórki:Decode kompleks JSON w Pythonie

 
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\"}"}} 

Potem, Python, próbuję deocding go za pomocą simplejson:

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

ten nie powiedzie się z powodu następującego błędu:

 
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) 

Jak mogę dostać ten obiekt JSON dec oded w Pythonie? Zarówno PHP, jak i JS dekodują go pomyślnie i nie mogę zmienić jego struktury, ponieważ wymagałoby to dużych zmian w wielu różnych komponentach w różnych językach.

Dzięki!

Odpowiedz

9

Spróbuj poprzedzając swój ciąg „R”, aby to surowy ciąg:

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

Co mówi Alex poniżej jest prawdziwe: można po prostu podwoić ukośniki. (Jego odpowiedź nie została opublikowana, kiedy zacząłem moje.) Myślę, że używanie surowych ciągów jest prostsze, choćby dlatego, że jest to funkcja językowa, która oznacza to samo i trudniej jest się pomylić.

+0

to działa, dziękuję! –

+0

Tak Zgadzam się hughdbbrown, zapomniałem o nieprzetworzonej funkcji Pythona. +1 –

1

Spróbuj

Może simplejson jest zbyt "proste".

+1

"simplejson jest zewnętrznie utrzymaną wersją rozwojową biblioteki json zawartej w Pythonie 2.6 i Pythonie 3.0" –

1

Jeśli chcesz wstawić ukośniki do łańcucha, muszą się one same uciec.

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

Przetestowałem go i Python obsługuje że wejście w porządku - z wyjątkiem użyłem modułu json zawarte w bibliotece standardowej (import json, Python 3.1).

+0

dzięki! ten też działa, ale ja wolę używać rozwiązania hughdbrown, ponieważ nie wymaga on zmian w innych komponentach. –

+0

Rozwiązania są równoważne, ale użycie surowego łańcucha wygląda lepiej :) –