Python json 序列化
json 模块
JSON : 是 一种 轻量级的 数据交换格式 、独立于编程语言的 数据格式。
数据格式 简单 、清晰。 便于 网络间数据的传输。
json 序列化 基本使用方式
序列化: Python中的对象转成 JSON格式的字符串
import json
ls = [{"name": "张三", "age": 20}, {"name": "李四", "age": 22}]
jsonstr = json.dumps(ls)
print(jsonstr)
-
dumps 方法中的参数
- skipkeys : JSON中 的键 只支持 字符串 、数字、布尔 、null 表示 ,如果 在 python 中 提供了不支持的键类型, 则 必须将 skipkeys 设置为 True
ls = [{"name": "张三", "age": 20, (1,2): 100, None: 1}, {"name": "李四", "age": 22}] jsonstr = json.dumps(ls, skipkeys=True) print(jsonstr)
- ensure_ascii : 对 ascii 之外的数据 进行 Unicode 编码 , 如果希望不进行编码,可以设置为 False
ls = [{"name": "张三", "age": 20, (1,2): 100, None: 1}, {"name": "李四", "age": 22}] jsonstr = json.dumps(ls, skipkeys=True, ensure_ascii=False)
- indent : 对 json 进行美化, 值是 一个 数字 、推荐使用 4
- allow_nan : 对序列化的数据 是否 支持 非数 float(“nan”) 、 正无穷 float(“inf”) 、 负无穷 float(“-inf”)
- default : 可以对 无法序列化的 对象 进行 特殊处理 (在序列化的时候,无法处理的类型 会触发 default 函数的调用。)
import json class Person: def __init__(self, name, age): self.name = name self.age = age if __name__ == '__main__': p1 = Person(name="张三", age=20) # p1.__dict__ : 可以获取一个对象的 字典表示形式。 p2 = Person(name="李四", age=21) p3 = Person(name="王五", age=22) p4 = Person(name="赵六", age=20) person_list = [p1, p2, p3, p4] # 使用 JSON 序列化 将数据 转成 JSON字符串 json_string = json.dumps(person_list, ensure_ascii=False, default=lambda obj: obj.__dict__, indent=2) print(json_string)
- cls : 允许定义一个类 、该类需要 继承 json.JSONEncoder ,并重写 父类 中 default 方法, 解决数据无法序列化的问题。
from datetime import date, datetime class Person: def __init__(self, name, age, birth=None): self.name = name self.age = age self.birth = birth class JsonEncoder(json.JSONEncoder): def default(self, o): if hasattr(o, "__dict__"): return o.__dict__ if isinstance(o, date): return o.strftime('%Y-%m-%d') if isinstance(o, datetime): return o.strftime('%Y-%m-%d %H:%M:%S') return str(o) if __name__ == '__main__': p1 = Person(name="张三", age=20, birth=date(2000, 10, 10)) print(p1.__dict__) p2 = Person(name="李四", age=21) p3 = Person(name="王五", age=22) p4 = Person(name="赵六", age=20) person_list = [p1, p2, p3, p4] # 使用 JSON 序列化 将数据 转成 JSON字符串 json_string = json.dumps(person_list, ensure_ascii=False, cls=JsonEncoder, indent=2) print(json_string)
- skipkeys : JSON中 的键 只支持 字符串 、数字、布尔 、null 表示 ,如果 在 python 中 提供了不支持的键类型, 则 必须将 skipkeys 设置为 True
-
loads(string , object_hook=None)
import json from datetime import date, datetime # 创建一个 json格式的字符串 string = '[{"name": "张三", "age": 20, "birth": "1990-10-10"}, {"name": "李四", "age": 20, "birth": "1990-10-10"}]' class Person: def __init__(self, name, age, birth=None): self.name = name self.age = age self.birth = birth def __repr__(self): return str(self.__dict__) def test(kwargs): if "birth" in kwargs: kwargs["birth"] = datetime.strptime(kwargs["birth"], '%Y-%m-%d').date() return Person(**kwargs) # 将 该字符串转成列表 ls = json.loads(string, object_hook=test) print(ls)