json.dumps で UTF-8 テキストを \u エスケープシーケンスではなく UTF-8 として保存する 質問する

json.dumps で UTF-8 テキストを \u エスケープシーケンスではなく UTF-8 として保存する 質問する

サンプルコード(再生産):

import json
json_string = json.dumps("ברי צקלה")
print(json_string)

出力:

"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

問題は、人間が読める形式ではないことです。私の (賢い) ユーザーは、JSON ダンプを使用してテキスト ファイルを検証したり、編集したりしたいと考えています (私は XML は使いたくありません)。

\uXXXXオブジェクトを UTF-8 JSON 文字列 ( の代わりに)にシリアル化する方法はありますか?

ベストアンサー1

ensure_ascii=Falseスイッチを使用してjson.dumps()、値を手動で UTF-8 にエンコードします。

>>> json_string = json.dumps("ברי צקלה", ensure_ascii=False).encode('utf8')
>>> json_string
b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
>>> print(json_string.decode())
"ברי צקלה"

ファイルに書き込む場合は、 を使用しjson.dump()、ファイル オブジェクトにエンコードを任せます。

with open('filename', 'w', encoding='utf8') as json_file:
    json.dump("ברי צקלה", json_file, ensure_ascii=False)

Python 2 に関する注意事項

Python 2では、さらに注意すべき点がいくつかあります。これをファイルに書き込む場合は、io.open()の代わりに、open()書き込み時に Unicode 値をエンコードするファイル オブジェクトを生成し、json.dump()そのファイルに書き込むには instead を使用します。

with io.open('filename', 'w', encoding='utf8') as json_file:
    json.dump(u"ברי צקלה", json_file, ensure_ascii=False)

ただし、jsonモジュールのバグここで、フラグはと のオブジェクトの混合ensure_ascii=Falseを生成する可能性があります。Python 2 での回避策は次のとおりです。unicodestr

with io.open('filename', 'w', encoding='utf8') as json_file:
    data = json.dumps(u"ברי צקלה", ensure_ascii=False)
    # unicode(data) auto-decodes data to unicode if str
    json_file.write(unicode(data))

Python 2 では、strUTF-8 にエンコードされたバイト文字列 (型 ) を使用する場合は、必ずキーワードも設定してくださいencoding

>>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
>>> d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}

>>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
>>> s
u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
>>> json.loads(s)['1']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> json.loads(s)['2']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> print json.loads(s)['1']
ברי צקלה
>>> print json.loads(s)['2']
ברי צקלה

おすすめ記事