PythonとJSON: オブジェクトのエンコードとデコード

PythonでのJSONの基本

Pythonは、JavaScript Object Notation(JSON)と呼ばれるデータ交換形式をサポートしています。JSONは、データを人間が読み書きできるテキスト形式で格納するための標準形式です。これは、データをWebサーバーとクライアント間で送受信する際に特に役立ちます。

Pythonのjsonモジュールを使用すると、PythonオブジェクトをJSON文字列に変換(シリアライズ)したり、JSON文字列をPythonオブジェクトに変換(デシリアライズ)したりすることができます。

以下に基本的な使用例を示します:

import json

# PythonオブジェクトをJSONに変換
person = {"name": "John", "age": 30, "city": "New York"}
person_json = json.dumps(person)
print(person_json)  # 出力:'{"name": "John", "age": 30, "city": "New York"}'

# JSONをPythonオブジェクトに変換
person = json.loads(person_json)
print(person)  # 出力:{'name': 'John', 'age': 30, 'city': 'New York'}

このように、PythonとJSONを使ってデータを簡単にエンコード・デコードすることができます。次のセクションでは、より詳細な変換方法について説明します。

PythonオブジェクトをJSONに変換する

Pythonのjsonモジュールは、Pythonの基本的なデータ型(例えば、辞書、リスト、文字列、数値、真偽値など)をJSON文字列に変換するためのdumps()関数を提供しています。以下にその使用例を示します:

import json

# Pythonの辞書をJSONに変換
person = {"name": "John", "age": 30, "city": "New York"}
person_json = json.dumps(person)
print(person_json)  # 出力:'{"name": "John", "age": 30, "city": "New York"}'

# PythonのリストをJSONに変換
numbers = [1, 2, 3, 4, 5]
numbers_json = json.dumps(numbers)
print(numbers_json)  # 出力:'[1, 2, 3, 4, 5]'

dumps()関数は、Pythonのデータ型をJSON形式の文字列に変換します。この関数は、オプションのパラメータを持ち、これにより出力のフォーマットを制御することができます。例えば、indentパラメータを使用すると、出力のJSON文字列を整形(インデント)することができます:

person_json = json.dumps(person, indent=4)
print(person_json)

このコードは、各レベルのデータを新しい行に表示し、4つのスペースでインデントします。これにより、出力のJSON文字列が読みやすくなります。

次のセクションでは、JSONをPythonオブジェクトに変換する方法について説明します。

JSONをPythonオブジェクトに変換する

Pythonのjsonモジュールは、JSON文字列をPythonの基本的なデータ型(例えば、辞書、リスト、文字列、数値、真偽値など)に変換するためのloads()関数を提供しています。以下にその使用例を示します:

import json

# JSONをPythonの辞書に変換
person_json = '{"name": "John", "age": 30, "city": "New York"}'
person = json.loads(person_json)
print(person)  # 出力:{'name': 'John', 'age': 30, 'city': 'New York'}

# JSONをPythonのリストに変換
numbers_json = '[1, 2, 3, 4, 5]'
numbers = json.loads(numbers_json)
print(numbers)  # 出力:[1, 2, 3, 4, 5]

loads()関数は、JSON形式の文字列をPythonのデータ型に変換します。この関数は、オプションのパラメータを持ち、これにより入力のフォーマットを制御することができます。例えば、object_hookパラメータを使用すると、JSONオブジェクトを特定のPythonオブジェクトに変換することができます。

次のセクションでは、カスタムオブジェクトとJSONの相互変換について説明します。

カスタムオブジェクトとJSON

Pythonのjsonモジュールは、カスタムオブジェクトをJSONに変換するための方法も提供しています。しかし、デフォルトでは、カスタムオブジェクトはJSONに直接変換することはできません。そのため、カスタムオブジェクトをJSONに変換するためには、カスタムエンコーダを定義する必要があります。

以下に、PythonのカスタムオブジェクトをJSONに変換する例を示します:

import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def encode_person(obj):
    if isinstance(obj, Person):
        return obj.__dict__
    return obj

person = Person("John", 30)
person_json = json.dumps(person, default=encode_person)
print(person_json)  # 出力:'{"name": "John", "age": 30}'

この例では、Personというカスタムクラスを定義し、encode_personというカスタムエンコーダを定義しています。encode_person関数は、Personオブジェクトをその属性の辞書に変換します。そして、json.dumps()関数のdefaultパラメータにこの関数を指定します。

同様に、JSONをカスタムオブジェクトに変換するためには、カスタムデコーダを定義する必要があります。これについては次のセクションで詳しく説明します。

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

Pythonのjsonモジュールを使用して、カスタムオブジェクトをJSONにエンコードし、JSONをカスタムオブジェクトにデコードする例を以下に示します:

import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def encode_person(obj):
    if isinstance(obj, Person):
        return obj.__dict__
    return obj

def decode_person(dct):
    if 'name' in dct and 'age' in dct:
        return Person(dct['name'], dct['age'])
    return dct

# カスタムオブジェクトをJSONにエンコード
person = Person("John", 30)
person_json = json.dumps(person, default=encode_person)
print(person_json)  # 出力:'{"name": "John", "age": 30}'

# JSONをカスタムオブジェクトにデコード
person = json.loads(person_json, object_hook=decode_person)
print(person)  # 出力:<__main__.Person object at 0x10d48d0d0>
print(person.name)  # 出力:'John'
print(person.age)  # 出力:30

この例では、Personというカスタムクラスを定義し、encode_personというカスタムエンコーダとdecode_personというカスタムデコーダを定義しています。encode_person関数は、Personオブジェクトをその属性の辞書に変換し、decode_person関数は、辞書をPersonオブジェクトに変換します。

そして、json.dumps()関数のdefaultパラメータにencode_person関数を指定し、json.loads()関数のobject_hookパラメータにdecode_person関数を指定します。これにより、カスタムオブジェクトとJSONの相互変換が可能になります。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です