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_encodeJSON_UNESCAPED_UNICODEオプションと同様の結果を得ることができます。

以上、PythonでJSONをUnicodeエスケープせずに扱う方法について説明しました。適切な方法を選んで、PythonでのJSON操作をより便利にしましょう。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です