Python的JSON数据解析,建议收藏!

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: