简单介绍
- json:是一种轻量级的数据交换格式,key value形式的,值可以是字符串,json对象、数组。
json常见函数:
json.dumps(python_obj) 将数据类型转换成字符串
json.loads(json_string) 将字符串转换成json对象
json.dump() 将数据类型转换成字符串并存储再文件中
json.load(file_stream) 把文件打开,把里面的字符串转换成数据类型
- jsonpath:An XPath for JSON ,JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。
官网:http://goessner.net/articles/JsonPath
语法格式与例子
用网上找到的一个经典json对象来做原材料,进行jsonpath的玩耍吧,json字符串如下
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
1.基本语法
1.1基本操作符:
- $ 根节点,即jsonpath的入口
- . 或者 [] 用于连接父子节点
注意 所有的命令前面都有一个美元符号,不知道为啥文章不显示
eg . store.book. category不能获取值,因为book的值是一个数组,需要这样写. store.book[1]. category,得到的是一个字符串
[] 区别:节点名必须加上单引号或者双引号,得到的是一个新的json对象,可以继续操作
[' store']['book']
[' store']['book']['category']
结果:['reference', 'fiction', 'fiction', 'fiction'] - .. 深层扫描,获取当前节点及其子节点下的所有指定对象
- *通配符
- 如果值是数组,需要进一步处理,对数组的处理方式有三种,分别是
第一种:索引(多个索引用逗号隔开),比如. store.book[1:3]
第三种:过滤表达式 格式:数组名[?(表达式)]
表达式的基本操作符: == != > >= < <=
=~ 正则匹配
In Nin Subsetof(子集) || 或 && 并且
eg:$. store.book[?(@ category=='fiction')]即可获得
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
$. store.book[?(@title =~/J.?/)] 匹配所有title以J开头并且后面跟了一个字符的
函数
$. store.book[?(@price.min()>=10)] 可以把价格筛选出来
函数有:Min() Max() Avg() Stddev() Length()
python中jsonpath的使用
import jsonpath
book = { "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
tmp = jsonpath.jsonpath(book,'$.store.book[*].category') # 如果取不到返回false
tmp1 = jsonpath.jsonpath(book,'$.store.book[?(@.price>=22.99)]') # 如果取不到返回false
print(tmp,tmp1)
输出:['reference', 'fiction', 'fiction', 'fiction']
[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]