Python 標準ライブラリ json JSONエンコーダ・デコーダ
Publish date: 2021-12-13
標準に用意されているjsonライブラリを使うと、 PythonオブジェクトのJSON化(直列化、シリアライズ、JSONエンコーディング)、および、 JSONからPythonオブジェクトへの変換(デシリアライズ、JSONデコーディング)を行える。
JSON文字列と辞書dictの変換
JSON文字列 → Pythonオブジェクト(辞書dict)
文字列でJSONを渡して、辞書dictで取得する。
python_object = json.loads('{"name": "Taro", "age": 20, "items": [1.1, 2.2, 3.3]}')
print(python_object)
# => {'name': 'Taro', 'age': 20, 'items': [1.1, 2.2, 3.3]}
print(type(python_object))
# => <class 'dict'>
Pythonオブジェクト(辞書dict) → JSON文字列
先程とは逆に辞書dictを、文字列JSONに変換する。
python_object = { 'name':'Taro', 'age':20, 'items':[1.1,2.2,3.3]}
json_string = json.dumps(python_object)
print(json_string)
# => {"name": "Taro", "age": 20, "items": [1.1, 2.2, 3.3]}
print(type(json_string))
# => <class 'str'>
ファイルオブジェクトを使ったJSONの変換
文字列ではなく、ファイルオブジェクトへの書き込み・読み込みを行うための関数も用意されている。
# 辞書オブジェクトをJSONにしてファイルに書き込み
with open('./sample.txt', mode='w', encoding='utf-8') as f:
python_object = { 'name':'Taro', 'age':20, 'items':[1.1,2.2,3.3]}
json.dump(python_object, f)
# ファイルに書き込んだ文字列の確認
with open('./sample.txt', mode='r', encoding='utf-8') as f:
json_string = f.read()
print(json_string)
# => {"name": "Taro", "age": 20, "items": [1.1, 2.2, 3.3]}
# ファイルを読み込んで辞書オブジェクトに変換
with open('./sample.txt', mode='r', encoding='utf-8') as f:
po = json.load(f)
print(po)
# => {"name": "Taro", "age": 20, "items": [1.1, 2.2, 3.3]}
print(type(po))
# <class 'dict'>
JSON変換の引数
loads/loadやdumps/dumpは変換の詳細を引数で指定できる。
loads/loadの引数 文字列またはファイルオブジェクト→辞書dict
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- cls カスタマイズしたデコーダを使う場合に指定
- object_hook デコードした結果をに対して呼び出すフック関数
- parse_float 不動小数点文字列に使用されるパーサ
- parse_int 整数文字列に使用されるパーサ
- parse_constant 特定文字(‘Infinity’, ‘NaN’, ’null’, ’true’等)のパーサ
- object_pairs_hook デコードした結果をに対して呼び出すフック関数
dumps/dumpの引数 辞書dict→文字列またはファイルオブジェクト
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- skipkeys Trueにすると基本型以外の辞書のキーの処理を飛ばす
- ensure_ascii Trueの場合非ASCII文字をエスケープ
- check_circular Falseの場合循環参照のチェックを行わない
- allow_nan Trueの場合、nan,inf,-infを変換する
- cls カスタマイズしたエンコードを使う場合に指定
- indent 数値や文字列でインデントを指定
- separators 項目とキーの分割文字のタプル
(',', ':')
- default 直列化で使う変換の関数
- sort_keys Trueの場合辞書順でキーを出力