【问题标题】:How to decode an invalid json string in python如何在python中解码无效的json字符串
【发布时间】:2012-09-12 17:35:19
【问题描述】:

我想知道是否有办法解码类似 JSON 的字符串。

我得到了字符串:

'{ hotel: { id: "123", name: "hotel_name"} }'

这不是一个有效的 JSON 字符串,所以我无法直接使用 python API 对其进行解码。 Python 将只接受字符串化的 JSON 字符串,例如:

 '{ "hotel": { "id": "123", "name": "hotel_name"} }'

其中属性被引用为字符串。

【问题讨论】:

    标签: python json python-2.7


    【解决方案1】:

    使用demjson 模块,它可以在非严格模式下解码。

    In [1]: import demjson
    In [2]: demjson.decode('{ hotel: { id: "123", name: "hotel_name"} }')
    Out[2]: {u'hotel': {u'id': u'123', u'name': u'hotel_name'}}
    

    【讨论】:

    • 不知道那个模块 - 必须检查一下 + 1
    • 很好,将使用这个模块! +1。
    【解决方案2】:

    您可以尝试使用 JavaScript 引擎的包装器,like pyv8.

    import PyV8
    ctx = PyV8.JSContext()
    ctx.enter()
    # Note that we need to insert an assignment here ('a ='), or syntax error.
    js = 'a = ' + '{ hotel: { id: "123", name: "hotel_name"} }'
    a = ctx.eval(js)
    a.hotel.id
    >> '123' # Prints
    

    【讨论】:

      【解决方案3】:

      @vartec 已经指出了demjson,它适用于稍微无效的 JSON。对于更不符合 JSON 的数据,我写了barely_json

      from barely_json import parse
      print(parse('[no, , {complete: yes, where is my value?}]'))
      

      打印

      [False, '', {'complete': True, 'where is my value?': ''}]
      

      【讨论】:

        【解决方案4】:

        不是很优雅,也不是很健壮(而且很容易被破坏),但可以用类似的东西来混合它:

        kludged = re.sub('(?i)([a-z_].*?):', r'"\1":', string)
        # { "hotel": { "id": "123", "name": "hotel_name"} }
        

        您可能会发现使用pyparsingparsePythonValue.py 示例也可以执行您想要的操作...(或很容易修改为这样做)或jsonParser.py 可以修改为不需要引用的键值.

        【讨论】:

          猜你喜欢
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 2011-02-02
          相关资源
          最近更新 更多