目录
简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互;
一、应用场景:
1. python + requests 请求接口时,入参一般是python语言的默认字典格式,如果有的接口的参数要求json格式就需要进行数据转换;如果出参接口返回的json格式,需要转换成python语言的格式字典格式;
2. jsonpath 注意用于提取接口返回参数的值,使用jsonpath提取数据方便快捷;
二、Python字典和JSON的区别
1、Python字典是一种数据结构,JSON是一种数据传输格式。
2、Python字典的类型是字典strDic={“a”:1},JSON的类型是字符串。例如,一个JSON是strJson = ‘{“a”:1}’,即strJosn这个变量是一个符合JSON格式的字符串。
3、Python字典的键key、值value可用单引号或者双引号,JSON强制必须使用双引号作为键key和值value的边界符号(json值value如果是数字可以不加双引号,但是键key只能是双引号引起来的字符串)
4、Python字典的键key不可以重复,JSON的键key可以重复;
5、Python字典的键key可以是不可变类型对象,JSON的键key只能是字符串;
6、Python字典的键key默认没有默认值,JSON任意键key存在默认值undefined。
7、Python字典的值value没有任何限制,可以是任意Python对象(包括首字母大写的布尔值True和False、空值None),JSON的值value只能是字符串、浮点数、小写的布尔值true和false(对应Python的True和False)、空值null(对应Python的None),或者它们JSON所构成的数组或者对象
8、Python字典里可以嵌套tuple,JSON里只有数组array。比如,,json.dumps({1:1}) 的结果是{“1”:1};json.dumps((1,2)) 的结果是[1,1];
9、JSON中文必须是Unicode编码(UTF-8代表8位一组表示Unicode字符的格式,即UTF-8是Unicode的实现方式之一)。比如,Python字典里{“me”: “我”}是合法的,JSON里必须是{“me”: “\u6211”}
三、Python 字典和Json之间的转换
1. json.loads()
把Json格式字符串解码转换成Python对象,从json到python的类型转化对照如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
import json
strList = '[1, 2, 3, 4]'
strDict = '{"city": "北京", "name": "大猫"}'
print(json.loads(strList))
print(json.loads(strDict))
'''
=====输出结果将json格式转换成python对象============
[1, 2, 3, 4]
{'city': '北京', 'name': '大猫'}
'''
2. json.dumps()
实现python类型转化为json字符串,返回一个str对象把一个Python对象编码转换成Json字符串,从python原始类型向json类型的转化对照如下:
import json
listStr = [1, 2, 3, 4]
tupleStr = (1, 2, 3, 4)
dictStr = {"city": "北京", "name": "大猫"}
print(json.dumps(listStr))
print(json.dumps(tupleStr))
# 注意:json.dumps() 序列化时默认使用的ascii编码
# 添加参数 ensure_ascii=False 禁用ascii编码,按utf-8编码
print(json.dumps(dictStr))
print(json.dumps(dictStr, ensure_ascii=False))
3. json.load()
读取文件中json形式的字符串元素 转化成python类型
import json
strList = json.load(open("listStr.json"))
print(strList)
4. json.dump()
字典转为json后存入文件
import json
dictStr = {"city": "北京", "name": "大刘"}
#把dicStr字典转换成json形式,然后存入文件dictStr.json
json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)
四、jsoJsonPath
JsonPath用符号$
表示最外层对象,类似于Xpath中的根元素
JsonPath可以通过点语法来检索数据,如:shell $.store.book[0].title
,也可以使用中括号[]的形式,如shell $['store']['book'][0]['title']
jsonpath方法需要两个参数:
参数1:数据
参数2:jsonpath表达式
注意点:
1.如果没有匹配不到数据返回的是False
2.匹配到数据返回的是包含数据的列表
1.操作符
JsonPath符号 | 描述 | |
---|---|---|
$ | 查询的根节点对象,用于表示一个json数据,可以是数组或对象 | |
@ | 过滤器断言(filter predicate)处理的当前节点对象,类似于java中的this字段 | |
* | 通配符,可以表示一个名字或数字 | |
… | 可以理解为递归搜索,Deep scan. Available anywhere a name is required. | |
. | 表示一个子节点 | |
[‘’ (, ‘’)] | 表示一个或多个子节点 | |
[ (, )] | 表示一个或多个数组下标 | |
[start:end] | 数组片段,区间为[start,end),不包含end | |
[?()] | 过滤器表达式,表达式结果必须是boolean |
2. 表达
JsonPath用符号$
表示最外层对象,类似于Xpath中的根元素
jsonPath可以用:
点表示法:.store.book [0].title
括号表示法:$['store']['book'][0]['title']
JsonPath表达式 | 结果 |
---|---|
$.store.book[*].author 或 $…author | 查询根节点下book节点的所有author信息 |
$.store.* 显示所有叶子节点值 | 查询根节点下store节点的所有author信息 |
$.store…price | 查询根目录下store节点的所有东西price信息 |
$…book[0,1] 或 $…book[:2] | 查询根节点下book节点的前两个值 |
$…book[-2:] | 查询根节点下book节点的最后两个值 |
$…book[?(@.isbn)] | 所有具有isbn属性的书 |
$.store.book[?(@.price < 10)] | 查询根节点下book节点所有价格小于10的书 |
$…book[?(@.price <= $[‘expensive’])] | 查询根节点下book节点所有价格低于expensive字段的书 |
$…book[?(@.author =~ /.*REES/i)] | 所有符合正则表达式的书 |
$…* | 返回所有 |
$…book.length() | 查询根节点下book节点符合条件的数量 |
3. 过滤器
过滤器是用于过滤数组的逻辑表达式,一个通常的表达式形如:[?(@.age > 20)],可以通过逻辑表达式&&或||组合多个过滤器表达式,例如[?(@.price < 10 && @.book == ‘fiction’)],字符串必须用单引号或双引号包围,例如[?(@.color == ‘baclk’)] or [?(@.color == “white”)]。
操作 | 描述 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
=~ | 匹配[JavaScript正则表达式]例如,匹配描述以cat开头(不区分大小写)的项目。[?(@.description =~ /cat.*/i)] |
! | 用于取消过滤条件:[?(!@.isbn)] 匹配不具有该isbn属性的项目。 |
&& | 逻辑AND,用于合并多个过滤器表达式:[?(@.category=='fiction' && @.price < 10)] |
|| | 逻辑OR,用于组合多个过滤器表达式:[?(@.category=='fiction' || @.price < 10)] |
in | 大于 |
=~ | 大于 |
4. 函数
注意:可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。
名称 | 描述 | 输出 |
---|---|---|
min() | 获取数值类型数组的最小值 | Double |
max() | 获取数值类型数组的最大值 | Double |
avg() | 获取数值类型数组的平均值 | Double |
stddev() | 获取数值类型数组的标准差 | Double |
length() | 获取数值类型数组的长度 | Integer |
5. Python 之 jsonpath 应用
import jsonpath
d = {
"error_code": 0,
"stu_info":
[
{"id": 223,
"name": "null",
"sex": "女",
"classname": "212期"
},
{"id": 224,
"name": "景龙",
"sex": "男",
"classname": "212期"
},
{"id": 225,
"name": "MS226",
"sex": "男",
"classname": "212期"
}
]
}
# 模糊匹配
data1 = jsonpath.jsonpath(d, "$..name")
print(data1)
# 精准匹配
data2 = jsonpath.jsonpath(d, "$.stu_info[0].name")
print(data2)
# 精准匹配(同上)
data3 = jsonpath.jsonpath(d, "$.stu_info[0]..name")
print(data3)
# 匹配所有数据
data4 = jsonpath.jsonpath(d, "$.*")
# print(data4)
# 匹配前两个学员信息
data5 = jsonpath.jsonpath(d, "$.stu_info[:2]")
print(data5)
# 匹配女生的信息
data6 = jsonpath.jsonpath(d, "$.stu_info[?(@.sex== '女')]")
print(data6)
# 过滤后,显示有性别数据的信息
data7 = jsonpath.jsonpath(d, "$.stu_info[?(@.sex)]")
print(data7)