JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。 这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
python类型数据和JSON数据格式互相转换规则
注意:python 中str类型到JSON中转为unicode类型,None转为null,dict对应object
注意:pyhton中的集合不能转成json格式
数据类型编解码
dump: 将对象序列化并保存到文件
load: 将序列化字符串从文件读取并反序列化
序列化及反序列化常用参数
ensure_ascii=False: 中文存储需要设定
indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
separators=(',',':'): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
sort_keys=True: 字典排序
# 代码
import json
# 1). 创建python对象
users = {}
for item in range(10):
users['user%s' %(item)] = '密码'
# 2). 将python对象编码为json对象
# """
# indent=4 --缩进为4
# ensure_ascii=False --如果显示中文需要设置
# separators=None -- 修改默认分隔符The default is ``(', ', ': ')``
# sort_keys -- 对字典的key值进行排序
# """
json_users = json.dumps(users, indent=4, ensure_ascii=False, separators=('*', '-'), sort_keys=True)
print(json_users)
print(type(json_users))
# # 3). 将python对象编码为json格式的字符串, 并保存到指定文件中;
with open('/home/kiosk/PycharmProjects/2019PythonProject/week05/day01/users.json', 'w') as f:
json.dump(users, f, indent=4, ensure_ascii=False)
# 4). loads
with open('/home/kiosk/PycharmProjects/2019PythonProject/week05/day01/users.json') as f:
content = f.read()
user_obj = json.loads(content)
print(user_obj)
print(type(user_obj))
# 5). load
with open('/home/kiosk/PycharmProjects/2019PythonProject/week05/day01/users.json') as f:
user_obj = json.load(f)
print(user_obj)
print(type(user_obj))
注意:
json.dumps()是将字典类型转化成字符串类型
json.loads()将字符串类型转化成字典类型
json.dump()用于将dict类型的数据转成str,并写入到json文件中
json.load()用于从json文件中读取数据
python的pickle模块
实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。 cPickle是pickle模块的C语言编译版本相对速度更快
JSON和pickle模块的区别
1)JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2).JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。
# 代码
"""
json :
序列化(编码): python对象编码成json字符串
反序列化(解码): 将json字符串转成python对象
pickle:
序列化(编码): python对象编码成pickle的bytes类型数据
反序列化(解码): 将pickle的bytes类型数据转成python对象
"""
import json
import pickle
nums = range(1, 10)
print(type(nums))
# json不能成功的序列化
# json_nums = json.dumps(nums)
# print(json_nums)
pickle_nums = pickle.dumps(nums)
print(pickle_nums)
print("序列化:", type(pickle_nums))
unpickle_nums = pickle.loads(pickle_nums)
print(unpickle_nums)
print("反序列化:", type(unpickle_nums))
# 运行结果
<class 'range'>
b'\x80\x03cbuiltins\nrange\nq\x00K\x01K\nK\x01\x87q\x01Rq\x02.'
序列化: <class 'bytes'>
range(1, 10)
反序列化: <class 'range'>