1-Python - jsonpath_rw
about
在嵌套结构较深的json数据中,想要获取到嵌套较深的数据非常的麻烦,而jsonpath-rw的思路是将json数据整体当成一个对象,然后通过路径查找的方式去找到指定位置的元素节点,跟xpah类似。
下载
pip install jsonpath_rw==1.4.0
pip install -i https://pypi.doubanio.com/simple jsonpath_rw==1.4.0
以下是简单的示例。
示例
如果Python处理后的json是这样的:
json_data = {
"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
}
},
"expensive": 10
}
我们现在获取store>bicycle>color
的值(所有路径都是唯一的,结果也是唯一的):
from jsonpath_rw import parse
# 查找store>bicycle>color
value_path = 'store.bicycle.color' # jsonpath的路径必须是字符串
js_exe = parse(value_path)
match = js_exe.find(json_data)
# 使用循环取value
print([i.value for i in match]) # red
查找列表中的元素
# 查找store下book列表中的所有category字段
js_exe = parse('store.book.[*].category') # 'store.book.[*].category' == '$.store.book.[*].category'
# js_exe = parse('$.store.book.[*].category') # $表示整个json对象
match = js_exe.find(json_data)
print([i.value for i in match]) # ['reference', 'fiction', 'fiction', 'fiction']
# 查找store下book列表中的第二个字典的category字段
js_exe = parse('store.book.[0].category') # 索引下表从1开始
# js_exe = parse('$.store.book.[0].category')
match = js_exe.find(json_data)
print([i.value for i in match]) # ['fiction']
使用$..来查询
from jsonpath_rw import parse
# 查找store下所有 color 字段,结果唯一
match = parse('$..color').find(json_data) # $.. 表示查找json对象中的所有的color字段
print([i.value for i in match]) # ['red']
# 查找store下所有 category 字段,结果不唯一
match = parse('$..category').find(json_data)
print([i.value for i in match]) # ['reference', 'fiction', 'fiction', 'fiction']
注意,这里其实借助了很多jsonpath的用法,要记住jsonpath-rw用法可以参考jsonpath的用法。
有关路径的更多处理操作参考:https://github.com/json-path/JsonPath
再次强调,我们参考的是JsonPath
,但是我们用的是jsonpath-rw
库。
see also: