在Python中解码复杂的JSON

5 投票
3 回答
6831 浏览
提问于 2025-04-15 13:23

我在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)

我该如何在Python中解码这个JSON对象呢?在PHP和JavaScript中都能成功解码,而我不能改变它的结构,因为那样会在不同语言的多个组件中引起大规模的变化。

谢谢!

3 个回答

1

如果你想在字符串里插入反斜杠(\),那么这些反斜杠需要进行转义,也就是说要加上额外的反斜杠。

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

我测试过,Python对这种输入处理得很好——不过我使用的是标准库里的json模块(import json, Python 3.1)。

1

试试以下这些资源:

也许simplejson太过于“简单”了。

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

下面Alex说的没错:你可以把斜杠加倍。(我开始写的时候,他的回答还没发出来。)我觉得使用原始字符串更简单,因为这是语言本身的一个特性,意思是一样的,而且不容易出错。

撰写回答