在Python中解码复杂的JSON

时间:2009-08-04 23:05:08

标签: php python json simplejson

我有一个用PHP创建的JSON对象,该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)

如何在Python中解码此JSON对象? PHP和JS都成功解码它,我无法改变它的结构,因为这需要对不同语言的许多不同组件进行重大更改。

谢谢!

3 个答案:

答案 0 :(得分:9)

尝试使用'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 :(得分:1)

尝试

也许simplejson太“简单”了。

答案 2 :(得分:1)

如果要将反斜杠插入字符串中,则需要自行转义。

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

我测试了它,Python处理了那个输入就好了 - 除了我使用了标准库中包含的json模块(import json,Python 3.1)。