あまりにも単純なことなので、書くまでもないかと思ったけど、これから何回も使いそうなので、メモがてらjsonのダンプ方法をまとめておく。
例えば、こんな感じの辞書をjsonとしてdumpしようとした時、幾つかの問題に出くわした。
dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}
f = open("output.json", "w")
json.dump(dict_sample, f)
上記のような日本語まじりの複雑な辞書をそのままdumpしてしまうと、出力は非常に見にくいものが出てくる。
output.json
{"Hiei": "\u90aa\u738b\u708e\u6bba\u9ed2\u9f8d\u6ce2", "Kurama": "\u30ed\u30fc\u30ba\u30a6\u30a3\u30c3\u30d7", "\u6851\u539f": "\u970a\u5263", "\u5e7d\u52a9": {"\u970a\u4e38": {"\u970a\u5149\u5f3e": 40, "\u30b7\u30e7\u30c3\u30c8\u30ac\u30f3": 30}}}
ワンライナーかよ!!asciiコードかよ!!
ということで、
##jsonを綺麗に表示できるようにdumpする
単に、json.dump
メソッドに幾つかのオプションを加えてあげるだけでいい感じのフォーマットに整形してくれる。
dict_sample = {'幽助': {'霊丸': {'ショットガン': 30, '霊光弾': 40}}, '桑原': '霊剣', 'Hiei': '邪王炎殺黒龍波', 'Kurama': 'ローズウィップ'}
f = open("output.json", "w")
json.dump(dict_sample, f, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))
ensure_ascii: False の場合、文字はそのまま出力されるとのこと
indent: 辞書のKeyやValueの階層を識別するためのインデント数
sort_keys: Keyでソートするか否か
separators:tuppleで1.KeyとValueを識別する区切り、2.要素を識別する区切りを指定できる
結果はこんな感じで帰ってくる
output.json
{
"Hiei": "邪王炎殺黒龍波",
"Kurama": "ローズウィップ",
"幽助": {
"霊丸": {
"ショットガン": 30,
"霊光弾": 40
}
},
"桑原": "霊剣"
}
めっちゃ読みやすくなった。
参考
公式ドキュメント