python-jsonpath

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不支持 其它:每一步操作都是对前面操作结果的筛选
posted @ 2020-09-12 00:03  花兒向陽開  阅读(394)  评论(0编辑  收藏  举报