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の相互変換が可能になります。