7

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

我得到了字符串:

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

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

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

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

4

4 回答 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'}}
于 2012-09-20T11:07:26.623 回答
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
于 2012-09-20T10:59:58.097 回答
2

@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?': ''}]
于 2017-05-12T17:11:32.553 回答
0

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

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

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

于 2012-09-20T11:03:00.037 回答