开发者

Python json序列化解读

目录
  • json 模块
    • json 序列化 基本使用方式
      • 序列化
      • dumps 方法中的参数
  • 总结

    json 模块

    • JSON : 是 一种 轻量级的 数据交换格式 、独立于编程语言的 数据格式。
    • 数据格式 简单 、清晰。 便于 网络间数据的传输。

    json 序列化 基本使用方式

    序列化

    • python中的对象转成 JSON格式的字符串
    import json
    ls = [{"name": "张三", "age": 20}, {"name": "李四", "age": 22}]
    jsonstr = jsjavascripton.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 : 对序列化的数据 是python否 支持 非数 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(namhttp://www.devze.come="王五", 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 sthttp://www.devze.comr(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)php
    
    • 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)

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜