2021-12-16に投稿

Python 標準ライブラリ json JSONエンコーダ・デコーダ

標準に用意されている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の場合辞書順でキーを出力

参考

Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント