Python json序列化

Python内置的json模块提供了很是完善的对象到JSON格式的转换。废话很少说,咱们先看看如何把Python对象变成一个JSON: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中读取字符串并反序列化:

好比这样:spa

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类,而后序列化?code

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的实例变为dictblog

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保存那些不重要的数据。
有兴趣的博友们可要试试。it

相关文章
相关标签/搜索