将json数据解码为Python字典

时间:2013-07-03 08:51:33

标签: python json json-rpc

我目前正在尝试从json格式的服务器响应中创建一个字典:

{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}}

因此我使用 json.loads()。但我总是得到以下错误:

ValueError: Expecting property name: line 1 column 12 (char 12)

我知道这意味着json语法中存在错误,我在stackoverflow中找到了一些线程(如this one),但它们没有包含解决我问题的答案。

但是,我不确定json响应中的 null 值是否会导致错误,所以我仔细查看了json.org Reference Manual,它似乎是一个有效的语法。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

无效。外部对象需要第二个元素的属性名称;原始值在对象中无效。

{"id": null, "somename":{"version": "1.1","result": "9QtirjtH9b","error": null}}

答案 1 :(得分:0)

这里的问题是缺少嵌套对象的键,而不是null。您需要找到一种方法来修复该语法或自己解析它。

如果我们对语法做了一些假设,那么应该能够在解码之前使用正则表达式来修复JSON数据:

import re
from itertools import count

def _gen_id(match, count=count()):
    return '{1}"generated_id_{0}":{2}'.format(next(count), *match.groups())

_no_key = re.compile(r'(,)({)')

def fix_json(json_data):
    return _no_key.sub(_gen_id, json_data)

这假定任何,{组合指示缺失密钥的位置,并生成一个以插入缺失密钥。这是一个合理的假设,但如果您的字符串数据恰好具有该序列,则可能会破坏。

演示:

>>> json_data = '{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}}'
>>> fix_json(json_data)
'{"id": null,"generated_id_0":{"version": "1.1","result": "9QtirjtH9b","error": null}}'
>>> json.loads(fix_json(json_data))
{u'id': None, u'generated_id_1': {u'version': u'1.1', u'result': u'9QtirjtH9b', u'error': None}}