python序列化

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

Python中使用json

导入json包

import json

json包有四个方法

  • json.dumps():将 Python 对象编码成 JSON 字符串

  • json.loads():将已编码的 JSON 字符串解码为 Python 对象

  • json.dump():将Python内置类型序列化为json对象后写入文件

  • json.load():读取文件中json形式的字符串元素转化为Python类型

dumps()跟loads()都是直接将python对象跟JSON字符串相互转换的方法,结果可以用一个变量接收,而dump()跟load()会把结果放到文件或者从文件中读取结果,因此需要传一个文件句柄

例如:

import json
 
data = {
    'nanbei':'haha',
    'a':[1,2,3,4],
    'b':(1,2,3)
}
with open('json_test.txt','w+') as f:
    json.dump(data,f)
    print(json.load(f))

将Python类对象序列化

有时候我们会自定义一个类,然后获得一个对象,这时我们想要对这个类对象进行序列化应该怎么办呢?

如下:

import json


class Person(object):

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender


p = Person("Tom", "female")

str_p = json.dumps(p)    # Object of type 'Person' is not JSON serializable
print(str_p)

上面的程序中,如果直接用dumps()去序列化对象p,会报Person不是一个可序列化的JSON类型

那么应该怎样解决这个问题呢?

其实在dumps()方法中有许多默认的参数,不妨从中找到解决办法

在dumps()中有一个default参数,我们可以传一个函数给它,这个函数的作用就是用来定制要被序列化的对象的序列化规则的

import json


class Person(object):

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender


# 定义将对象转换为json的函数
def obj2json(obj):
    return {
        "name": obj.name,
        "gender": obj.gender
    }


p = Person("Tom", "female")

str_p = json.dumps(p, default=obj2json)
print(str_p)

当然可以利用lambda表达式结合 __dict__ 来做更简单

import json


class Person(object):

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender


p = Person("Tom", "female")

str_p = json.dumps(p, default=lambda obj: obj.__dict__, sort_keys=True, indent=4)
print(str_p)

sort_keys=True 会按照字典中的键来按照ASCII方式来排序

indent=4 会按照键值对以间隔4来直观的显示

在类里面定制规则

除了在方法里面定制规则以外,还可以写一个类,继承JSONEncoder,重写default()方法,在那里面制定序列化规则

import json
from json.encoder import JSONEncoder


class Person(object):

    def __init__(self, name, gender):
        self.name = name
        self.gender = gender


class JsonEncoder(JSONEncoder):

    def default(self, o):
        return o.__dict__      # 定制序列化规则


p = Person("Jack", "male")
print(json.dumps(p, cls=JsonEncoder))

 

posted @ 2018-12-19 15:49  Jin同学  阅读(322)  评论(0)    收藏  举报