1. ホーム
  2. python

[解決済み] json.dumpsでutf-8テキストを保存する場合、UTF8として保存し、 \uエスケープシーケンスとして保存しない。

2022-03-15 18:52:04

質問

サンプルコードです。

>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print(json_string)
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"

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

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

解決方法は?

を使用します。 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() の代わりに、そのファイルに書き込むようにします。

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

があることに注意してください。 のバグを修正しました。 json モジュール ここで ensure_ascii=False フラグを使用すると まぜかえす unicodestr オブジェクトを使用します。 Python 2 での回避策は、次のとおりです。

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 では、バイト文字列 (タイプ str をUTF-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']
ברי צקלה