json数据和Python类型的转化
json包
本小节主要讲解的json类型数据和Python类型的转化。
json对象和Python字典的转化主要使用的是内置json包,下面详细介绍该包的使用。详细的学习资料见官网:https://docs.python.org/3/library/json.html
首先使用的时候直接导入该包:
import json
json包中存在4中方法用来进行和Python内置数据类型的转化:
| 方法 | 作用 |
|---|---|
| json.dumps() | 将python对象编码成Json字符串:字典到json |
| json.loads() | 将Json字符串解码成python对象:json到字典 |
| json.dump() | 将python中的对象转化成json储存到文件中 |
| json.load() | 将文件中的json的格式转化成python对象提取出来 |
笔记:两个和load相关的方法只是多了一步和文件相关的操作。
json.dumps
和dump相关的两个函数是将Python数据类型转成json类型,转化对照表如下:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
json.dumps方法的作用是将Python字典类型的数据转成json格式的数据,具体的参数如下:
json.dumps(obj, # 待转化的对象
skipkeys=False, # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii=True, # 默认是ASCII码,若设置成False,则可以输出中文
check_circular=True, # 若为False,跳过对容器类型的循环引用检查
allow_nan=True, # 若allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)
cls=None,
indent=None, # 参数根据格式缩进显示,表示缩进几个空格
separators=None, # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: `
encoding="utf-8", # 编码
default=None, # 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误
sort_keys=False, # 若为False,则字典的键不排序;设置成True,按照字典排序(a到z)
**kw)
通过例子来解释上面几个常见参数的作用
1、当我们的Python类型数据中存在中文
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
# 字典转成json数据
information2 = json.dumps(information1)
print(type(information1))
print(type(information2))
print(information2)
加上ensure_ascii=False参数即可显示中文:
# 字典转成json数据
information3 = json.dumps(information1,ensure_ascii=False)
⚠️通过结果我们发现:json数据中全部变成了双引号,原来的字典类型数据中使用的是单引号,再看一个关于引号变化的例子:
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)) # python中的键是字符串,用单引号
# 结果显示
{
"4": 5, # 变成双引号
"6": 7
}
2、对json数据通过缩进符美观输出,使用indent参数
information4 = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '会计',
'address': '深圳'
}
information5 = json.dumps(information4, ensure_ascii=False) # 不缩进
information6 = json.dumps(information4, ensure_ascii=False, indent=2) # 缩进2个空格
information7 = json.dumps(information4, ensure_ascii=False, indent=5) # 缩进5个空格
print(information5)
print(information6)
print(information7)
3、对Python数据类型中键进行排序输出
information4 = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '会计',
'address': '深圳'
}
information8 = json.dumps(information4, ensure_ascii=False, indent=2) #
information9 = json.dumps(information4, ensure_ascii=False, indent=2,sort_keys=True) # 键的排序设置成True
print(information8)
print(information9)
通过sort_keys=True的设置,可以观察到输出的结果进行了首写字母的排序;当首写字母相同,按照第二个字母再进行排序。
4、输出分隔符的控制
使用separators参数来设置不同的输出分隔符;不同的dic元素之间默认是,,键值对之间默认是:
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
information2 = json.dumps(information1,ensure_ascii=False)
information10 = json.dumps(information1,ensure_ascii=False,separators=('+','@')) # 改变分隔符
print(information2) # 默认连接符
print(information10)
json.dump
json.dump功能和json.dumps类似,只是需要将数据存入到文件中,二者参数相同
我们尝试将下面的个人信息写入到文件中
information = {
'name': '小明',
'age': 18,
'skills': 'python',
'english': 'CET6',
'major': '会计',
'address': '深圳'
}
1、如果不使用indent参数,全部信息显示为一行
# 使用json.dump;json数据一定是双引号
with open("information_1_to_json.json", "w", encoding='utf-8') as f:
# json.dump(dic_, f) # 全部写入一行数据,不换行
json.dump(information, # 待写入数据
f, # File对象
sort_keys=True, # 键的排序
ensure_ascii=False) # 显示中文
看看实际的保存效果:
加入indent参数,会显示成多行数据:
with open("information_2_to_json.json", "w", encoding='utf-8') as f:
json.dump(information,
f,
indent=2, # 空格缩进符,写入多行
sort_keys=True,
ensure_ascii=False)
json.loads
和load相关的两个函数是将json转成Python数据类型,转化对照表如下:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
json.loads的作用是将json格式的数据转成Python字典类型的数据。
information1 = {
'name': '小明',
'age': 18,
'address': 'shenzhen'
}
# 字典转成json数据
information3 = json.dumps(information1,ensure_ascii=False)
information11 = json.loads(information3) # json转成字典数据
print(information11)
json.load
打开json文件再转成字典形式的数据
# 使用json.load
with open("information_to_json.json",encoding="utf-8") as f:
json_to_dict = json.load(f) # json转成字典
print(json_to_dict)
python其他类型数据转成json数据
上面介绍的主要是json格式数据和Python字典之间的转化,下面讲解了Python其他数据类型通过json.dumps方法转成json个数据:
1、元组转化
2、列表转化
3、布尔值转化
4、数值型数据转化
Demjson
Demjson是Python的第三方库,能够用于编码和解码json数据:
- encode:将 Python 对象编码成 JSON 字符串
- decode:将已编码的 JSON 字符串解码为 Python 对象
安装demjson
直接使用pip install demjson安装,kan'dao看到如下界面表示安装成功。
使用demjson
使用之前先进行导入:
import demjson # 导入包
1、编码功能
2、解码功能
demjson包一个明显的缺点就是不能直接解析中文数据:
如果我们想看到中文数据,可以使用eval函数: