jsonのエンコードとデコード

pythonの標準ライブラリ、jsonを使用すると、json形式の文字列と辞書型を相互に変換することができます。使い方を見ていきましょう

dict型からjson文字列に変換

dumpsメソッド

dumpsメソッドを使用すると、dict型からjson文字列に変換することができます。また、引数にindentを指定すると、指定した数だけスペースでインデントをつけた見やすい形に整形してくれます。

import json

# dict型からjson文字列に変換する
dict_data = {"items" : [{"id" :1, "name": "pen"}, {"id" :2, "name": "apple"}, {"id" :3, "name": "painapple"}], "status": "sell"}

# jsonの文字列形式
json_str = json.dumps(dict_data)
print(json_str)

# インデントをつける
json_str = json.dumps(dict_data, indent=2)
print(json_str)

asciiエンコード

また、デフォルトではasciiにエンコードされますので、asciiエンコードしない場合はensure_ascii=Falseを指定します。

import json

# 日本語が格納された辞書
dict_data = {"items" : [{"id" :1, "name": "ペン"}, {"id" :2, "name": "アップル"}, {"id" :3, "name": "パイナップル"}], "status": "sell"}

# asciiエンコードする場合
json_str = json.dumps(dict_data, ensure_ascii=True) # 日本語部分が\u30da\u30f3のように出力される。
print(json_str)

# asciiエンコードしない場合
json_str = json.dumps(dict_data, ensure_ascii=False)
print(json_str)

ソートする

pythonのdict型は順序を持たないため、出力するたびに結果jsonの順序が変わります。ソートしたい場合はsort_keysオプションを指定します。

# import文等は省略
json_str = json.dumps(dict_data, sort_keys=True) # ソートされる

json文字列からdict型に変換

loadsメソッド

では、今度は逆にjson文字列からdict型に変換してみましょう。loadsメソッドを使用します。

import json

# json文字列からdict型に変換する
json_str = '{"items": [{"id": 1, "name": "ペン"}, {"id": 2, "name": "アップル"}, {"id": 3, "name": "パイナップル"}], "status": "sell"}'
dict_data = json.loads(json_str)
print(type(dict_data)) # <class 'dict'> dict型に変換できたことが確認

jsonファイルからdict型に変換

また、jsonファイルの場合はread()で一旦文字列に変換しなくても、loadメソッドを使用することでファイルオブジェクトからdict型に変換することが可能となります。

import json

# jsonファイルからdict型に変換する
f = open('json_file.txt', 'r')
dict_data = json.load(f)
print(type(dict_data)) # <class 'dict'> dict型に変換できたことが確認