序列化–JSON
- 把变量从内存中变成可存储或传输的过程称之为序列化(pickling)
- 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输(个人认为是最好的~)
- JSON表示的对象就是标准的JavaScript语言的对象
python内置的json
模块可以进行python对象到JSON格式的转换.
- 序列化
json.dumps()
与json.dump()
有s的是返回一个str
,内容就是标准的JSON;后者可以直接把JSON写入一个file-like Object
(JSON格式化流)
import json
d = dict(name='lf',age='18',score=99)
json.dumps(d) # '{"name": "lf", "age": "18", "score": 99}'
with open('json.txt','w') as f:
json.dump(d,f)
- 反序列化
json.loads()
与json.load()
与上面对应
import json
json_d = '{"name": "lf", "age": "18", "score": 99}'
dict_d = json.loads(json_d)
print(type(dict_d)) # <class 'dict'>
with open('json.txt','rb') as f:
load_d = json.load(f)
print(load_d)
print(type(load_d)) # <class 'dict'>
JSON进阶
- python的dict对象可以直接序列化为JSON的
{}
python的class的实例对象 转换为 JSON对象(序列化)
方式一
import json class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score def student2dict(std): return { 'name':std.name, 'age': std.age, 'score':std.score } s = Student('Bob',20,88) print(json.dumps(s,default=student2dict))
方式二(通过实例的
__dict__
获取实例中dict
对象) 推荐import json class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score s = Student('Bob',20,88) print(s.__dict__) # {'name': 'Bob', 'age': 20, 'score': 88} print(type(s.__dict__)) # <class 'dict'> print(json.dumps(s,default=lambda obj:obj.__dict__))
- JSON对象 转换为 python的class的实例对象(反序列化)
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def dict2student(d):
"""返回Student实例对象"""
return Student(d['name'],d['age'],d['score'])
json_str = '{"name": "Bob", "age": 20, "score": 88}'
stu1 = json.loads(json_str, object_hook=dict2student)
print(stu1) # <__main__.Student object at 0x00000165B3208668>
print(stu1.age) # 20
扩展
- 对中文进行JSON序列化时,
json.dumps()
提供了一个ensure_ascii
参数将中文转为unicode,py3默认是true
obj = dict(name='小明')
s = json.dumps(obj,ensure_ascii=True)
print(s) # '{"name": "\u5c0f\u660e"}'
ss = json.dumps(obj,ensure_ascii=False)
print(ss) # '{"name": "小明"}'