【问题标题】:Decode complex JSON in Python在 Python 中解码复杂的 JSON
【发布时间】:2010-11-16 20:26:18
【问题描述】:

我在 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 对其进行解码:

>>> 将 simplejson 导入为 json >>> json.loads('{"a":{"a1":"{\"foo\":\"bar\",\"foo1\":\"bar1\"}"}}')

这会失败并出现以下错误:

回溯(最近一次通话最后): 文件“”,第 1 行,在? 加载中的文件“build/bdist.linux-i686/egg/simplejson/__init__.py”,第 307 行 解码中的文件“build/bdist.linux-i686/egg/simplejson/decoder.py”,第 335 行 文件“build/bdist.linux-i686/egg/simplejson/decoder.py”,第 351 行,在 raw_decode ValueError: Expecting , delimiter: line 1 column 14 (char 14)

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

谢谢!

【问题讨论】:

    标签: php python json simplejson


    【解决方案1】:

    尝试在你的字符串前面加上 '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 下面说的是真的:你可以把斜线加倍。 (当我开始使用原始字符串时,他的答案没有发布。)我认为使用原始字符串更简单,因为它是一种语言功能,意思相同,而且更难出错。

    【讨论】:

    • 是的,我同意hughdbbrown,我忘记了Python 的原始字符串特性。 +1
    【解决方案2】:

    如果你想在字符串中插入反斜杠,他们需要自己转义。

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

    我已经对其进行了测试,Python 可以很好地处理该输入 - 除了我使用了标准库中包含的 json 模块(import json,Python 3.1)。

    【讨论】:

    • 谢谢!这个也可以,但我更喜欢使用hughdbrown的解决方案,因为它不需要更改其他组件
    • 解决方案是等价的,但使用原始字符串确实看起来更整洁:)
    【解决方案3】:

    试试

    也许 simplejson 太“简单”了。

    【讨论】:

    • "simplejson 是 Python 2.6 和 Python 3.0 附带的 json 库的外部维护开发版本"
    猜你喜欢
    • 2020-05-10
    • 2021-09-09
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多