JSONにダンプすると、二重引用符と引用符のエスケープが追加されます


86

Pythonツールを使用してTwitterデータを取得し、これらをJSON形式でディスクにダンプしています。ツイートのデータ文字列全体が二重引用符で囲まれているため、意図せずにエスケープされていることに気付きました。さらに、実際のJSONフォーマットのすべての二重引用符はバックスラッシュでエスケープされます。

彼らはこのように見えます:

"{\" created_at \ ":\" Fri Aug 08 11:04:40 +0000 2014 \ "、\" id \ ":497699913925292032、

どうすればそれを回避できますか?そのはず:

{"created_at": "Fri Aug 08 11:04:40 +0000 2014"....。

私のファイル出力コードは次のようになります。

with io.open('data'+self.timestamp+'.txt', 'a', encoding='utf-8') as f:
            f.write(unicode(json.dumps(data, ensure_ascii=False)))
            f.write(unicode('\n'))

意図しないエスケープは、後の処理ステップでJSONファイルを読み込むときに問題を引き起こします。

回答:


140

JSON文字列を二重にエンコードしています。dataすでにJSON文字列であり、再度エンコードする必要はありません:

>>> import json
>>> not_encoded = {"created_at":"Fri Aug 08 11:04:40 +0000 2014"}
>>> encoded_data = json.dumps(not_encoded)
>>> print encoded_data
{"created_at": "Fri Aug 08 11:04:40 +0000 2014"}
>>> double_encode = json.dumps(encoded_data)
>>> print double_encode
"{\"created_at\": \"Fri Aug 08 11:04:40 +0000 2014\"}"

これらをファイルに直接書き込むだけです。

with open('data{}.txt'.format(self.timestamp), 'a') as f:
    f.write(data + '\n')

f.write(data + '\ n')-は、例の--data = encoded_data--と相関します。
リッチエルズウィック

@RichElswick OPは、dataすでにエンコードされたJSONデータを含む変数を使用します。そのため、はい、変数名を使用してencoded_data何が起こっているのかを説明しました。
MartijnPieters

9

この不要なエスケープが発生する可能性がある別の状況は、json.dumps()の前処理された出力でjson.dump()を使用しようとした場合です。例えば

import json, sys
json.dump({"foo": json.dumps([{"bar": 1}, {"baz": 2}])},sys.stdout)

結果として

{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}

これを回避するには、json.dumps()の出力ではなく、辞書を渡す必要があります。

json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)

希望の出力

{"foo": [{"bar": 1}, {"baz": 2}]}

(なぜjson.dumps()で内部リストを前処理するのですか?そうですね、他のものからその内部リストを作成する別の関数があり、jsonオブジェクトをから返すのが理にかなっていると思いましたその機能...間違っています。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.