JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)
用于序列化的两个模块:
- json: 用于字符串和python数据类型间进行转换
- pickle: 用于python特有的类型和python的数据类型间进行转换
JSON、pickle两个模块有dumps、dump、loads、load四个功能
dumps:把数据类型转换成字符串
dump: 把数据类型转换成字符串并存储在文件中
loads:把字符串转换成数据类型
load:把文件打开从字符串转换成数据类型
pickle模块
d = dict(name='bob', age=20, score=88)
print(pickle.dumps(d))#把任意对象序列化为一个bytes
输出二进制数据:
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00scoreq\x03KXX\x03\x00\x00\x00ageq\x04K\x14u.'
使用loads反序列化:
pickle_data = b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00scoreq\x03KXX\x03\x00\x00\x00ageq\x04K\x14u.'
pickle_loads = pickle.loads(pickle_data)
print(type(pickle_loads))
print(pickle_loads)
输出数据:
<class 'dict'>#反序列化为字典类型
{'age': 20, 'score': 88, 'name': 'bob'}
把字典中的数据以二进制方式写入文件:
d = dict(name='bob', age=20, score=88)
with open("test.txt", mode='wb') as f:
pickle.dump(d, f)#把序列化之后的bytes写入文件
f.close()
![](https://i-blog.csdnimg.cn/blog_migrate/0da06d65f854e0587b3ccb22ecf5c5c3.png)
读取文件中的二进制数据,并转为字典格式数据:
with open("test.txt", mode='rb') as f:
content = pickle.load(f)
f.close()
print(type(content))
print(content)
输出:
<class 'dict'>
{'score': 88, 'name': 'bob', 'age': 20}
JSON模块
d = dict(name='bob', age=20, score=88)
json_data = json.dumps(d)
print(type(json_data))
print(json_data)
输出字符串数据(pickle输出的是二进制数据):
<class 'str'>
{"score": 88, "age": 20, "name": "bob"}
使用loads把字符串转为字典对象:
json_str = '{"score": 88, "name": "bob", "age": 20}'
json_obj = json.loads(json_str)
print(type(json_obj))
print(json_obj)
输出字典对象:
<class 'dict'>
{'age': 20, 'name': 'bob', 'score': 88}
使用dump把字典对象写入文件中:
d = dict(name='bob', age=20, score=88)
with open("test.txt", mode='w') as f:
json.dump(d, f)
f.close()
文件中内容:
使用load加载文件中的数据:
with open("test.txt", mode='r') as f:
content = json.load(f)
f.close()
print(type(content))
print(content)
输出字典类型数据:
<class 'dict'>
{'name': 'bob', 'score': 88, 'age': 20}
把对象转为json字符串:
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student(name='test', age=29)
def student2dic(std):
return {
'name': std.name,
'age': std.age
}
data = json.dumps(stu, default=student2dic)
print(type(data))
print(data)
输出:
<class 'str'>
{"name": "test", "age": 29}
简单方法:
data = json.dumps(stu, default=lambda obj:obj.__dict__)
print(type(data))
print(data)
输出:
<class 'str'>
{"age": 29, "name": "test"}
把json字符串转为对象:
class Student(object): def __init__(self, name, age): self.name = name self.age = age json_str = '{"age": 29, "name": "test"}' def dic2student(d): return Student(d['name'], d['age']) data = json.loads(json_str, object_hook=dic2student) print(type(data)) print(data)
输出:
<class '__main__.Student'>
<__main__.Student object at 0x000001CAF6C0E6A0>
简单方式:
json_str = '{"age": 29, "name": "test"}' stu = json.loads(json_str, object_hook=lambda d:Student(d['name'], d['age'])) print(stu.name) print(stu.age)
输出:
test
29
python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。
与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型
json中的几个参数详解:
sort_keys:排序
json_data = {'b': 'cc', 'ac': 'bb', 'aa': 'aa'} print(json.dumps(json_data, sort_keys=True))
输出
{"aa": "aa", "ac": "bb", "b": "cc"}
indent:缩进参数
json_data = {'b': 'cc', 'ac': 'bb', 'aa': 'aa'} print(json.dumps(json_data, sort_keys=True, indent=4))
{
"aa": "aa",
"ac": "bb",
"b": "cc"
}
ensure_ascii:True/False,默认True, 是否以ascii码返回
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'} print(json.dumps(json_data, sort_keys=True, indent=4, ensure_ascii=True))
输出:
{
"aa": "\u5317\u4eac",
"ac": "\u9996\u90fd",
"b": "\u4e2d\u56fd"
}
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'} print(json.dumps(json_data, sort_keys=True, indent=4, ensure_ascii=False))
输出:
{
"aa": "北京",
"ac": "首都",
"b": "中国"
}
separators:压缩,缩进
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'} print(json.dumps(json_data, separators=(',', ':'), ensure_ascii=False)) print(json_data)
输出:
{"b":"中国","aa":"北京","ac":"首都"}
{'b': '中国', 'aa': '北京', 'ac': '首都'}
separators = (',', ':')格式应该是固定的,如果写成separators=(':', ',')
json_data = {'b': '中国', 'ac': '首都', 'aa': '北京'} print(json.dumps(json_data, separators=(':', ','), ensure_ascii=False)) print(json_data)
输出:
{"b","中国":"aa","北京":"ac","首都"}
{'b': '中国', 'aa': '北京', 'ac': '首都'}
如有不对地方,请指正