• Python json序列化


    Python内置的json模块提供了非常完善的对象到JSON格式的转换。废话不多说,我们先看看如何把Python对象变成一个JSON:

    d = dict(name='Kaven', age=17, sex='Male')
    print(json.dumps(d))  # {"name": "Kaven", "age": 17, "sex": "Male"}

    说明:

    dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个 Object。
    
    要把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的{},那么如何用class对象,比如定义Person类,然后序列化?

    dumps 可选参数default就是把任意一个对象变成一个可序列为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,大家看到下面有个lambda匿名函数,他的用处可大了,比如:
    下次如果遇到一个Apple/Banaba等类的实例,可以把任意class的实例变为dict

    print(json.dumps(s, default=lambda obj: obj.__dict__)) # obj为对象参数名,可自定义

    同样的道理,如果我们要把JSON反序列化为一个Person对象实例,loads()方法首先转换出一个dict对象,然后,我们再传入的object_hook函数负责把dict转换为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 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保存那些不重要的数据。
    有兴趣的博友们可要试试。

  • 相关阅读:
    salmon 报错:ESC[00mException : [rapidjson internal assertion failure: IsObject()] salmon quant was invoked improperly.
    报错:RSEM can not recognize reference sequence name chr1!(基因组的bam不能直接用rsem进行表达值计算)
    R: 使用tapply根据相同ID合并指定列
    linux:去除特定列为空格的行
    知乎一答:程序员为什么要关注管理
    如何掌握一门编程语言的运用
    谈谈程序员这个职业及前景
    Oracle学习笔记(2)--Centos 7 下11gR2部署
    用flask写一个简单的接口
    iptables命令详解
  • 原文地址:https://www.cnblogs.com/phpper/p/10648480.html
Copyright © 2020-2023  润新知