Python karmaşık JSON Decode

3 Cevap php

Hey, I have a JSON object created in PHP, that JSON object contains another escaped JSON string in one of it's cells:

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

Sonra, Python, ben simplejson kullanarak deocding deneyin:

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

Bu, aşağıdaki hata ile başarısız olur:

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)

Nasıl bu JSON nesne Python çözümlenmiş alabilirim? PHP ve JS hem de başarılı bir şekilde çözmek ve farklı dillerde birçok farklı bileşenlerinde önemli değişiklikler gerektirecektir çünkü yapıdır değiştiremezsiniz.

Teşekkürler!

3 Cevap

Ham bir dize yapmak için 'r' ile dize önek deneyin:

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

Ne Alex aşağıdaki diyor doğrudur: Eğer sadece bölü iki katına çıkarabilir. (Benimkini başladığımda Onun cevabı yayınlanmıştır değildi.) Ben çiğ dizelerini kullanarak aynı şeyi ifade bir dil özelliği tek nedeni ise, basit ve yanlış almak zor olduğunu düşünüyorum.

Denemek

Belki simplejson çok "basit".

Eğer kendilerini kaçan gereken bir dizeye backslash'lar eklemek istiyorum.

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

Ben bunu test ettik ve Python sadece iyi o girdi kolları - Ben standart kitaplıkta bulunan json modülünü (import json, Python 3.1) kullanılır hariç.