PythonでJSONを扱う際、日本語などのUnicode文字をエスケープせずにそのまま出力したい場合があります。そのための方法を以下に示します。
json.dumpを使う方法
Pythonの標準ライブラリであるjson
モジュールのdump
関数を使うと、JSON形式でデータを出力することができます。しかし、デフォルトでは日本語などのUnicode文字は\uXXXX
形式でエスケープされてしまいます。これを防ぐには、ensure_ascii=False
オプションを指定します。
import json
data = {"ほげ": "ほげ"}
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
このコードを実行すると、output.json
ファイルにはエスケープされていない日本語がそのまま出力されます。
raw_json_encodeを使う方法
一方、PHPではjson_encode
関数にJSON_UNESCAPED_UNICODE
オプションを指定することでUnicodeエスケープを防ぐことができます。Pythonにはこのオプションに相当するものはありませんが、同様の機能を実現するための関数raw_json_encode
を自作することができます。
def raw_json_encode(input, flags=0):
fails = implode('|', array_filter(array(
'\\\\\\\\',
flags & JSON_HEX_TAG ? 'u003[CE]' : '',
flags & JSON_HEX_AMP ? 'u0026' : '',
flags & JSON_HEX_APOS ? 'u0027' : '',
flags & JSON_HEX_QUOT ? 'u0022' : '',
)))
pattern = "/\\\\\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/"
callback = lambda m: html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8')
return preg_replace_callback(pattern, callback, json_encode(input, flags))
この関数を使うと、json_encode
のJSON_UNESCAPED_UNICODE
オプションと同様の結果を得ることができます。
以上、PythonでJSONをUnicodeエスケープせずに扱う方法について説明しました。適切な方法を選んで、PythonでのJSON操作をより便利にしましょう。