0

現在、json 形式のサーバー応答から辞書を作成しようとしています。

{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}}

したがって、私はjson.loads()を使用しています。しかし、私は常に次のエラーが発生します。

ValueError: Expecting property name: line 1 column 12 (char 12)

これは、json 構文にエラーがあることを意味することを知っており、ここでいくつかのスレッド (このような) をスタックオーバーフローで見つけましたが、問題を解決する答えが含まれていませんでした。

ただし、 json 応答内のnull値がエラーの原因であるかどうかはわからなかったため、 json.org リファレンス マニュアルを詳しく調べたところ、有効な構文のようです。何か案は?

4

2 に答える 2

2

有効ではありません。外側のオブジェクトには、2 番目の要素のプロパティ名が必要です。生の値はオブジェクトでは無効です。

{"id": null, "somename":{"version": "1.1","result": "9QtirjtH9b","error": null}}
于 2013-07-03T08:53:41.063 に答える
0

ここでの問題は、ネストされたオブジェクトのキーではなく、null. その構文を修正するか、自分で解析する方法を見つける必要があります。

構文についていくつかの仮定を立てると、正規表現を使用して、デコードする前に JSON データを修正できるはずです。

import re
from itertools import count

def _gen_id(match, count=count()):
    return '{1}"generated_id_{0}":{2}'.format(next(count), *match.groups())

_no_key = re.compile(r'(,)({)')

def fix_json(json_data):
    return _no_key.sub(_gen_id, json_data)

これは、,{コンボが不足しているキーの場所を示していると想定し、そこに挿入するものを生成します。これは合理的な仮定ですが、文字列データが正確にその順序である場合、問題が発生する可能性があります。

デモ:

>>> json_data = '{"id": null,{"version": "1.1","result": "9QtirjtH9b","error": null}}'
>>> fix_json(json_data)
'{"id": null,"generated_id_0":{"version": "1.1","result": "9QtirjtH9b","error": null}}'
>>> json.loads(fix_json(json_data))
{u'id': None, u'generated_id_1': {u'version': u'1.1', u'result': u'9QtirjtH9b', u'error': None}}
于 2013-07-03T09:10:03.097 に答える