web-dev-qa-db-ja.com

json.loads()は、辞書ではなくUnicodeオブジェクトを返します

ファブリックを使用してリモートサーバー上のファイルからjsonを読み込んでいます:

_from StringIO import StringIO

output = StringIO()
get(file_name, output)

output = output.getvalue()
_

outputの値は次のようになります。

_'"{\\n \\"status\\": \\"failed\\", \\n \\"reason\\": \\"Record already exists.\\"\\n}"'_

json.loads(output)を使用してこの文字列を辞書に解析しようとすると、辞書ではなくユニコードオブジェクト_u'{\n "status": "failed", \n "reason": "Record already exists."\n}'_が返されます。

新しいユニコードオブジェクトをjson.loads()に戻すだけで、かなり悪い修正を思いつきました。

json.loads(json.loads(output))

これに対する他の解決策はありますか?

乾杯

13
Dr Potato

データはエスケープされます。

json.loads(output.decode('string-escape').strip('"'))

あなたに望ましい結果を与えるはずです:

Out[12]: {'reason': 'Record already exists.', 'status': 'failed'}
19
m.wasowski

ここでの解決策は、ファイルが最初に二重にJSONエンコードされている理由を理解することですが、データがjson.loadsを2回通過することを考えると正しいアプローチです。

15
Andrew Clark