【问题标题】:Decoding json data to Python dictionary将 json 数据解码为 Python 字典
【发布时间】:2013-06-30 21:12:48
【问题描述】:

我目前正在尝试从 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,它似乎是一个有效的语法。有什么想法吗?

【问题讨论】:

    标签: python json json-rpc


    【解决方案1】:

    这里的问题是缺少嵌套对象的键,而不是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}}
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好吧,我错过了。但是,在不知道结果的确切结构的情况下,如何在这些结果中添加自己的对象名称呢?我无法强制服务器创建有效响应,所以我必须自己修复它,但我不知道服务器的确切格式规则。
      • 你将不得不暴力解析字符串。
      • 由于json解析器解析字符串的时候报错,所以不能直接处理。最好的方法是编写自己的解析器,或者您可以编写一个函数来获取字符串并检查它,并在使用 json 解析它之前进行准确的更改。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2021-09-29
      • 2021-11-04
      • 2021-06-03
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多