python-json
json
对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
- JSON注意事项:
- (1)名称必须用双引号(即:" ")来包括
- (2)值可以是双引号包括的字符串、数字、true、false、null、JavaScript数组,或子对象。
import json
# json的四个函数
json.dumps() # 将 Python 对象编码成 JSON 字符串
json.loads() # 将已编码的 JSON 字符串解码为 Python 对象
json.dump() # 将Python内置类型序列化为json对象后写入文件
json.load() # 读取文件中json形式的字符串转化为Python类型
json.dumps()
# dumps()函数可以将 Python 对象编码成 Json 字符串
json.dumps(obj,ensure_ascii=False,sort_keys,indent,separators)
"""输入参数
常用参数
obj 需要转换的python数据
ensure_ascii 默认值True,需要显示中文时,设置为False
indent 根据数据格式缩进显示,int 代表缩进的位数
sort_keys 根据keys的值进行排序
separators 分隔符,默认的就是(',',':')
其他参数
encoding 默认是UTF-8
Skipkeys 默认值是False,如果dict的keys内的数据不是python的基本类型会报TypeError,设置成True,则会跳过这类key
"""
d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}
print(json.dumps(d,ensure_ascii=False,indent=4))
# 显示中文,缩进为4
#执行结果:
{
"小明": {
"sex": "男",
"addr": "上海",
"age": 26
},
"小红": {
"sex": "女",
"addr": "上海",
"age": 24
}
}
注: 在这里我们可以看到,原先的单引号已经变成双引号
json.loads()
# loads()函数可以将 json 字符串转换成 Python 的数据类型
json.loads(s,object_hook,object_pairs_hook,parse_float,parse_int,)
"""输入参数
S 需要转成python对象的数据,可以str类型,也可以unicode类型
其他参数
object_hook None.返回结果字典替换为你所指定的类型
object_pairs_hook None 将结果以key-value有序列表的形式
parse_float None,符合float类型的字符串将被转为你所指定
parse_int None,符合int类型的字符串将被转为你所指定
"""
# 这是users.json文件中的内容
'''
{
"小明":{
"sex":"男",
"addr":"上海",
"age":26
},
"小红":{
"sex":"女",
"addr":"上海",
"age":24
}
}
'''
import json
#打开‘users.json’的json文件
f =open('users.json','r',encoding='utf-8')
#读文件
res=f.read() # 必须需要读取文件
print(json.loads(res))
#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}
json.dump()
# dump()函数可以将 Python对象编码成 json 字符串,并自动写入到文件中,不需要再单独写文件
json.dump(obj, fp, **)
"""输入参数
obj 需要转换的python数据
fp 打开的文件
其他参数 和json.dumps() 相似
"""
d={'小明':{'sex':'男','addr':'上海','age':26},'小红':{ 'sex':'女','addr':'上海', 'age':24},}
#打开一个名字为‘users.json’的空文件
fw =open('users.json','w',encoding='utf-8')
json.dump(d,fw,ensure_ascii=False,indent=4)
json.load()
# load()跟loads()功能相似,load()函数可以将 json 字符串转换成 Python 数据类型
# 不同的是前者的参数是一个文件对象,不需要再单独读此文件
#把json串变成python的数据类型:字典,传一个文件对象,不需要再单独读文件
# 打开文件
import json
f =open('users.json','r',encoding='utf-8')
print(json.load(f))
#执行结果:
{'小明': {'sex': '男', 'addr': '上海', 'age': 26}, '小红': {'sex': '女', 'addr': '上海', 'age': 24}}
两对函数异同点
json.dumps(obj)
# 字典、对象 转 json (字符串)
json.loads(s)
# json(字符串) 转 字典、对象
# 直接对数据进行操作
# 操作对象类型不同 字符串
json.dump()
json.load()
# 直接对文件进行操作
# 操作对象类型不同 文件流
注意事项
# 针对将字符串、json 转 字典、对象
json.dumps(obj)
mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23"}'
mes_to_dict = json.loads(mes)
print type(mes_to_dict) # <type 'dict'>
# 以上代码是正常的
# 错误的写法为
mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24'}"
mes_to_dict = json.loads(mes)
# output >>> ValueError
# 补救方法
mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23"}'
mes_dict = eval(mes)
print type(mes_dict)
<type 'dict'>