json+jsonpath
一、介绍
json是文本的文件,有规范的编写格式。
支持的数据类型:number,bool,str。以及由他们组成的 [] 和 {} 。
格式:key必须用双引号修饰并且不可以重复
json在python中一般做dict处理。
使用:json.load(fp)可以加载json文件,并返回一个dict。
使用:json.dump(dict())可以将dict()直接写入json文件。
二、json模块
1.load和dump
这两个方法是json文件和dict之间的处理。
标准格式的json文件:json.load(open('path','r',encoding='utf-8')) -> dict
dict对象:json.dump(dict(),open('path','w',encoding='utf-8')) -> file写入
2.loads和dumps
这两个方法是json str和dict之间的处理。
dict对象:json.dumps(dict())) -> json str
json str:json.loads(str(json_str)) -> dict
说明:json_str必须是符合json格式的字符串。
3.编码
json以asscll码解析,中文不在asscll码中,会以unicode编码后,转化为标准json格式。
encoding参数,json转化为dict时,可以指定编码格式为utf-8,可以正常显示为中文。
ensure_ascii参数,dict转化为json时,默认为True,以标准的json格式存储(中文转码),需要以中文显示,则设定为False,来正常显示中文。
通常:操作json。load设定encoding=‘utf-8’即可;dump设定ensure_ascii=False即可。(正常显示中文)
http请求和响应中的json。使用fiddler抓包,查看raw可以发现,中文已经被转码。fiddler中提供了json方式查看请求内容,可以比较友好的查看json的请求内容(中文显示)
其它编码问题:unicode编码支持和任何格式的编码转化。遇到两个无法互转的编码时,可以通过unicode作为中转来实现转码。(python中以utf-8编码)
4.json和dict
json在python中有两种形式,①满足json格式的字符串,可以转化为json;②dict,可以转换为json。
json <-> dict 对应关系
json -> python | python -> json | |||
json | python | python | json | |
object | dict | dict | object | |
array | list | list,tuple | array | |
string | unicode | str,unicode | string | |
number(int) | int,long | int,long,float | number | |
nuber(real) | float | True | true | |
true | True | False | false | |
false | False | None | null | |
null | None |
5.requests库中的json和dict。
requests库。
请求参数:params,data,json。都可以接收参数dict,根据不同的参数,对dict进行不同的处理。如:json参数接收一个dict,处理结果为json_str。
响应方法:json(),text,content。使用json()方法,python中会接收到一个dict。
总结:①requests库的json请求参数并不需要使用标准的json格式字符串,直接使用dict即可。②在python中处理传输过程中尽量使用统一的格式。
7.jsonpath模块
json在python中以dict形式存在。jsonpath模块的处理对象是json(dict)。
通常用法:①精确搜索,唯一路径 -> value;②模糊搜索,不唯一路径 -> list(value1,value2,...)
jsonpath函数/方法:jsonpath.jsonpath(<express>,obj)
jsonpath的express规则
json示例:{"key1":1,"key2":2,"key3":{"key31":31,"key32":[321,322,323]}}
JsonPath | 描述 | 示例 |
$ | 根节点:{} | '$.key1'=[1] |
@ | 当期元素(结合条件使用) | '$..key32[?(@>321)]'=[322,323] |
. or [] | 子节点 | '$.key2'=[2]='$[key2]' |
.. | 递归所有节点(路径通配) | '$.key3..'=所有的元素+元素的元素 |
* | 元素通配符 | '$..key32[*]'=[321,322,323] |
[] | 多个节点key | '$..[key1,key2]'=[1,2] |
[,] | 多个array节点下标 | '$..key32[0,2]'=[321,323] |
[start:end] | array片段 | '$..key32[:2]'=[321,322] |
[?()] | 过滤 | [?(@)] 同常这三个一起使用实现条件过滤 |
() | 表达式计算 | ①包含元素[?@.key31]②value条件$.[?@>321] |
n/a | 分组,jsonpath不支持 | 其它:每一步操作都是对前面操作结果的筛选 |