如何在python中解码无效的json字符串

时间:2012-09-20 10:54:13

标签: python json python-2.7

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

我收到了字符串:

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

它不是有效的JSON字符串,因此我无法使用python API直接对其进行解码。 Python只接受字符串化的JSON字符串,如:

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

其中引用属性为字符串。

4 个答案:

答案 0 :(得分:9)

使用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 :(得分:3)

您可以尝试使用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

答案 2 :(得分:1)

@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?': ''}]

答案 3 :(得分:0)

不是很优雅而且不健壮(并且容易折断),但有可能用以下类似方法来克服它:

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

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