jsonシリアル化の詳細な使用法の紹介-pythonチュートリアル

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を使用してこれらの重要でないデータを保存するだけです。

おすすめ

転載: blog.csdn.net/m0_67575344/article/details/123907862
おすすめ