Python的JSON数据解析,建议收藏!
在进行测试工作时,我们通常会从接口中提取数据或在某些数据库中使用数据,而这些数据大多采用JSON格式。 (文末总结了常用的json数据转换网站)
什么是json
JSON(JavaScript Object Notation, JS 对象简谱)是一种
轻量级的数据交换格式
。采用完全独立于编程语言的文本格式来存储和表示数据。易于阅读和编写,同时也易于机器解析和生成,并能有效地提升网络传输效率。
使用规范:
1. JSON语言中规定了字符集必须是UTF-8
2. 为了统一解析,JSON的字符串规定必须是双引号 ""
Json格式
python和json的对应关系:list/str/dict 都可以转换成json格式。
python变量格式 | json格式 |
dict | string字符串 |
list/tuple | array数组 |
str/unicode | string字符串 |
int/long/float | number数字 |
True/False | true/false布尔类型(注意是小写) |
None | null |
Json序列化
json对象和Python字典的转化主要使用的是内置json包。
使用的时候直接导入该包:
import json
方法 | 作用 |
json.dumps() | 将python对象编码成Json字符串:字典到json |
json.dump() | 将python中的对象转化成json储存到文件中 |
json.dumps()
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)
下面通过简单的例子来理解json字符串和普通字符串的区别:
1、定义一个data1字典
data1 = {
'a':'A',
'b':(2, 4),
'c':3.0
转成普通的字符串:
a = repr(data2) #repr()将python格式,转换成普通字符串
print(a)
print(type(a))
结果:
{'a': 'A', 'b': (2, 4), 'c': 3.0}
<class 'str'>
转成json字符串:
data_string = json.dumps(data2)
print(data_string)
print(type(data_string))
结果:
{"a": "A", "b": [2, 4], "c": 3.0}
<class 'str'>
⚠️注:可以看到,JSON的字符串是双引号
""
,而普通字符串是单引号
''
。
再来看看json.dumps()中的参数是如何使用的。
2、定义一个data1字典
data1 = {
'name':'小爱',
'skills':'python',
'address':'杭州'
未添加任何参数,转成json格式:
#中文未转码,未按照字母排序
{"name": "\u5c0f\u7231", "skills": "python", "address": "\u676d\u5dde"}
添加中文转码和字母排序:
{"address": "杭州", "name": "小爱", "skills": "python"}
json.dump()
json.dump功能和json.dumps类似,二者参数一致,但json.dump是将python数据转换成json数据后写⼊到⽂件,因为python对象不能直接写⼊到⽂件。
1、定义一个data1列表
data1 = [{
'name':'小爱',
'skills':'python',
'address':'杭州'
将data1个人信息 直接 写入到文件中:
with open('output.json', 'w') as f:
f.write(data1)
f.close()
结果:
Traceback (most recent call last):
File "/Users/shchl/Desktop/chengli/pythonProject/test_json.py", line 18, in <module>
f.write(data1)
TypeError: write() argument must be str, not list
⚠️注:可以看到提示参数必须是 字符串 类型,不能是列表。
使用json.dump,将json数据写入文件:
with open('output.json', 'w') as f:
json.dump(data1,f,ensure_ascii=False)
查看写入的文件:
[{"name": "小爱", "skills": "python", "address": "杭州"}]
Json反序列化
将json数据转换成python对象,⽅便我们进⾏:增删改查(数据提取和解析)
方法 | 作用 |
json.loads() | 将Json字符串解码成python对象:json到字典 |
json.load() | 将文件中的json的格式转化成python对象提取出来 |
json.loads()
json.loads的作用是将json格式的数据转成Python字典类型的数据。
1、还是拿上面的例子来看,定义一个json串data_json
data_json = '''{ "a":"A", "b":null, "c":"3.0" }'''
转成字典:
data_dict = json.loads(data_json)
print(data_dict)
print(type(data_dict))
结果:
{'a': 'A', 'b': None, 'c': '3.0'}
<class 'dict'>
⚠️注:可以看到,双引号已经转成单引号,null也转成None。
json.load()
打开json文件再转成字典形式的数据。
2、在上面例子中我们已经dump了一个output.json文件,现在可以直接load
with open("output.json",encoding="UTF-8") as f: