Pythonの組み込みjsonモジュールは、非常に高度なオブジェクトからJSONへの変換を提供します。さらに面倒なことはせずに、PythonオブジェクトをJSONに変換する方法を見てみましょう。
d = dict(name='Kaven', age=17, sex='Male')
print(json.dumps(d)) # {"name": "Kaven", "age": 17, "sex": "Male"}
説明:
dumps()メソッドは、コンテンツが標準のJSONであるstrを返します。同様に、dump()メソッドはJSONをオブジェクトに直接書き込むことができます。
JSONをPythonオブジェクトに逆シリアル化するには、loads()または対応するload()メソッドを使用できます。前者はJSON文字列を逆シリアル化し、後者はObjectから文字列を読み取って逆シリアル化します。
例えば:
import json
json_str = '{"name": "Kaven", "age": 17, "sex": "Male"}'
print(json.loads(json_str)) # {'name': 'Kaven', 'age': 17, 'sex': 'Male'}
PythonのdictオブジェクトはJSON{}に直接シリアル化できるので、Personクラスを定義してからシリアル化するなど、クラスオブジェクトを使用するにはどうすればよいでしょうか。
ダンプのオプションのパラメーターのデフォルトは、任意のオブジェクトをJSONとしてシリアル化できるオブジェクトに変換することです。Personの変換関数を記述し、その関数を次のように渡すだけです。
import json
class Person(object):
# __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict,
# 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def PersonToDict(cls):
return {
'name': cls.name,
'age': cls.age,
'sex': cls.sex
}
s = Person('Kaven', 17, 'Male')
print(json.dumps(s, default=PersonToDict))
# print(json.dumps(s, default=lambda obj: obj.__dict__)) 输出和上面一样
# 输出 : {"name": "Kaven", "age": 17, "sex": "Male"}
このように、Personインスタンスは最初にPersonToDict()関数によってdictに変換され、次にJSONにシリアル化されます。以下にラムダ無名関数があります。これは次のように非常に便利です。
次回、Apple / Banabaなどのクラスのインスタンスに遭遇した場合、任意のクラスのインスタンスをdictに変えることができます。
print(json.dumps(s, default=lambda obj: obj.__dict__)) # obj为对象参数名,可自定义
同様に、JSONをPersonオブジェクトインスタンスに逆シリアル化する場合、loads()メソッドは最初にdictオブジェクトを変換し、次に渡すobject_hook関数がdictをPersonインスタンスに変換します。
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import json
class Person(object):
# __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict,
# 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def DictToPerson(d):
return Person(d['name'], d['age'], d['sex'])
json_str = '{"name": "Kaven", "age": 20, "sex": "Male"}'
cls = json.loads(json_str, object_hook=DictToPerson)
print(cls.name) # Kaven
Pythonにはpickleモジュールもありますが、これにはPythonの互換性の問題がある可能性があり、Pickleを使用してこれらの重要でないデータを保存するだけです。