在我的应用中,序列化就是把类转成符合JSON格式的字符串,反序列化就是把JSON格式的字符串转换成类。C#的话直接用Newtonsoft.JSON就可以了,非常好用。本来以为python也会有类似的库,但是貌似并没有。网上查了一些python用来实现JSON序列化和反序列化的方法,用的最多的就是json.loads, json.dumps。

# 序列化:将Python对象转换成json字符串
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

# 反序列化:将json字符串转换成Python对象
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
# 序列化:将Python对象转换成json字符串并存储到文件中
dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

# 反序列化:读取指定文件中的json字符串并转换成Python对象
load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

包含自定义类的序列化例子:

from typing import List

class Address:
    def __init__(self,country,city):
        self.country=country
        self.city=city

class Student:
    def __init__(self,name,age,sex,address):
        self.name=name
        self.age=age
        self.sex=sex
        self.address=address

class School:
    def __init__(self,name,address:Address,students:List[Student]):
        self.name=name
        self.address=address
        self.students=students


import json

addr1=Address('China','Beijing')
stu1=Student('lily',20,'female',Address('China','Shanghai'))
stu2=Student('tom',23,'male',Address('China','Shenzhen'))
sch1=School('MathSchool',addr1,[stu1,stu2])

# 先把python对象转换为dict对象,进而才能实现序列化
json_data=json.dumps(sch1,default=lambda o:o.__dict__,indent=2)
print(json_data)

输出结果为:

{
  "name": "MathSchool",
  "address": {
    "country": "China",
    "city": "Beijing"
  },
  "students": [
    {
      "name": "lily",
      "age": 20,
      "sex": "female",
      "address": {
        "country": "China",
        "city": "Shanghai"
      }
    },
    {
      "name": "tom",
      "age": 23,
      "sex": "male",
      "address": {
        "country": "China",
        "city": "Shenzhen"
      }
    }
  ]
}
序列化结果

相关文章: