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

pyv8のようなJavaScriptエンジンのラッパーを試して使用することができます

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"} }

pyparsingを使用すると、parsePythonValue.py例が同様に必要なことを実行できることがわかる場合があります... (または、そうするためにかなり簡単に変更する) または、jsonParser.py引用符で囲まれたキー値を必要としないように変更することができます。

于 2012-09-20T11:03:00.037 に答える