如何在Python中解码无效的JSON字符串

7

我想知道是否有一种方法可以解码类JSON字符串。

我得到的字符串是:

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

这不是一个有效的JSON字符串,所以我无法直接使用Python API解码它。 Python只接受类似于字符串化的JSON字符串:

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

属性应该用引号括起来表示为字符串。

4个回答

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 - Jon Clements
整洁,会使用这个模块!+1。 - Aesthete

4

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

它比demjson更加健壮。 - showkey

3
你可以尝试使用JavaScript引擎的包装器,比如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

0

不太优雅也不够健壮(容易出问题),但是可能可以通过类似以下的方法来解决:

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

你可能会发现使用pyparsingparsePythonValue.py示例也可以实现你想要的功能...(或者很容易地进行修改),或者可以修改jsonParser.py以不需要引号括起来的键值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接