JSONPath与Xpath语法对比
JSON结构清晰,可读性高,复杂度低,非常容易匹配。JSONPath的语法与Xpath类似,表1中列举了JSONPath对应XPath的用法。
表1 JSONPath与XPath语法对比
XPath | JSONPath | 描述 |
---|---|---|
/ | $ | 根节点 |
. | @ | 现行节点 |
/ | .or[] | 取子节点 |
.. | n/a | 取父节点,JSONPath未支持 |
// | .. | 就是不管位置,选择所有符合条件的节点 |
* | * | 匹配所有元素节点 |
@ | n/a | 根据属性访问,JSON不支持,因为JSON是个key-value递归结构,不需要属性访问。 |
[] | [] | 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选。 |
[] | ?() | 支持过滤操作. |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JSONPath不支持 |
接下来使用一个JSON文档来演示JSONPath的具体使用。JSON文档的内容如下:
{
"store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "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
}
}
}
假设变量bookJson里已经包含了这段JSON字符串,那么可通过以下代码反序列化得到JSON对象:
books = json.loads(bookJson)
(1)查看store下的bicycle的color属性:
checkurl = "$.store.bicycle.color"
print(jsonpath.jsonpath(books, checkurl))
# 输出:['red']
(2)输出books列表中包含的所有对象
checkurl = "$.store.book[*]"
object_list = jsonpath.jsonpath(books, checkurl)
print(object_list)
(3)输出books列表的第一个对象
checkurl = "$.store.book[0]"
obj = jsonpath.jsonpath(books, checkurl)
print(obj)
# 输出:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}]
(4)输出books列表中所有对象对应的属性title值
checkurl = "$.store.book[*].title"
titles = jsonpath.jsonpath(books, checkurl)
print(titles)
# 输出:['Sayings of the Century', 'The Lord of the Rings']
(5)输出books列表中category为fiction的所有对象
checkurl = "$.store.book[?(@.category=='fiction')]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]
(6)输出books列表中所有价格小于10的对象
checkurl = "$.store.book[?(@.price<10)]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}]
(7)输出books列表中所有含有isbn的对象
checkurl = "$.store.book[?(@.isb)]"
books = jsonpath.jsonpath(books, checkurl)
print(books)
# 输出:[{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]