【Python】JSONのシリアライズ/デシリアライズ方法

pythonPython

この記事の内容

この記事では、PythonにてJSONのシリアライズとデシリアライズの方法について解説しています。

JSONのシリアライズおよびデシリアライズの方法を学習することで、

  • REST APIのRequestに使用するJSONの生成
  • REST APIのResponseから必要なデータの取得

などに役立てることができます。

この記事を読むことで、コードレベルでJSONのシリアライズとデシリアライズ方法を学ぶことができます。

まずは、JSONのシリアライズとデシリアライズの概要について説明していきます。

JSONのシリアライズとデシリアライズの概要

まず、コードレベルの解説を始める前に、シリアライズとデシリアライズのイメージについて、解説します。

以下の図をご覧ください。

まず、Pythonのオブジェクトや文字列をJSON形式に変換することをシリアライズといいます。

反対に、JSON形式のデータを、Pythonのオブジェクトや文字列に変換することをデシリアライズといいます。

JSONのシリアライズ

シリアライズには大きく分けて2種類あります。

  1. dump()を使用して、PythonオブジェクトをJSONファイルに保存する方法
  2. dumps()を使用して、PythonオブジェクトをJSON形式の文字列にする方法

シリアライズ時に、Pythonの型とJSONの型で違いがあります。

その際、型や値の形式が変換されます。

そのデフォルトの変換形式は以下になります。

PythonJSON
dictobject
list, tuplearray
strstring
int、float と int や float の派生列挙型number
Truetrue
Falsefalse
Nonenull

dump()を使用した、JSONファイルへのシリアライズ

dump()を使用して、JSONファイルへ保存するコードを記載します。

このコードでは、dataオブジェクトの内容を、sample.jsonへ出力します。

また、dump()関数の引数にindent = 4を指定することで、インデントが入った形で出力することができます。

import json

data = {
    "user":{
        "name":"ReMIX",
        "age": 31,
        "enabled" : False
    }
}

def main(file_path):
    with open(file_path, "w") as file:
        json.dump(data, file, indent=4)

if __name__ == "__main__":
    file_path = 'sample.json'
    main(file_path)
sample.jsonのファイル内容は以下になります。
{
    “user”: {
        “name”: “ReMIX”,
        “age”: 31,
        “enabled”: false
    }
}

dumps()を使用した、JSON形式文字列へのシリアライズ

dumps()を使用して、JSON形式への文字列を取得するコードを記載します。

このコードでは、dumps()の戻り値で取得したJSON形式の文字列をprint()関数で出力しています。

import json

data = {
    "user":{
        "name":"ReMIX",
        "age": 31,
        "enabled" : False
    }
}

def main():
    json_string = json.dumps(data, indent=4)
    print(json_string)
    # >> {
    # >>     "user": {
    # >>         "name": "ReMIX",
    # >>         "age": 31,
    # >>         "enabled": false
    # >>     }
    # >> }
        
if __name__ == "__main__":
    main()

JSONのデシリアライズ

デシリアライズにもシリアライズと同じく、大きく分けて2種類あります。

  1. load()を使用して、JSONファイルからPythonオブジェクトを生成する方法
  2. loads()を使用して、JSON形式の文字列からPythonオブジェクトを生成する方法

シリアライズ時と同様に、デシリアライズ時にも型や値の形式が変換されます。

そのデフォルトの変換形式は以下になります。

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)浮動小数点数
trueTrue
falseFalse
nullNone

load()を使用した、JSONファイルからのデシリアライズ

load()を使用した、JSONファイルからのデシリアライズの方法を記載します。

sample.jsonのファイル内容は以下になります。
{
    “user”: {
        “name”: “ReMIX”,
        “age”: 31,
        “enabled”: false
    }
}
import json

def main(file_path):
    
    with open(file_path, "r") as file:
        data = json.load(file)
        print(data)
        # >> {'user': {'name': 'ReMIX', 'age': 31, 'enabled': False}}

if __name__ == "__main__":
    file_path = 'sample.json'
    main(file_path)

loads()を使用した、JSON形式文字列からのデシリアライズ

loads()を使用した、JSON形式文字列からのデシリアライズの方法を記載します。

import json

def main():
    json_string = """{
        "user": {"name": "ReMIX", "age": 31}}
    """
    data = json.loads(json_string)
    print(data)
    # >> {'user': {'name': 'ReMIX', 'age': 31}}

if __name__ == "__main__":
    main()

まとめ

この記事では、以下について解説しました。

  • JSONのシリアライズとデシリアライズの概要
  • JSONのシリアライズ方法(dump(),dumps()を使用する方法)
  • JSONのデシリアライズ方法(load(),loads()を使用する方法)

コメント