一、选择器
1、JSONPath的选择器是一个类XPath的表达式,它的语法很简单,也非常强大。基于json的语法特点, JSONPath提供了很多针对特定json结构的选择器,可以轻松地获取到需要的json数据。
2、JSONPath选择器的基础语法是:$.[path][index_start:index_end:step]
3、其中'.'
表示当前节点,'..'
表示上一节点,'[]'
表示属性选取,':xx'
表示数组截取。
// 根节点选择器
JSONObject jsonObject = JSON.parseObject(json);
Object eval = JsonPath.read(jsonObject, "$.store.book[*].author");
// 查找所有价格低于10美元的书
List<Map<String, Object>> books = JsonPath.read(jsonObject, "$.store.book[?(@.price < 10)]");
// 选择第二本书
Map<String, Object> book2 = JsonPath.read(jsonObject, "$.store.book[1]");
// 查找最后一本书
Map<String, Object> lastBook = JsonPath.read(jsonObject, "$.store.book[-1]");
// 选择所有书的isbn
List<String> isbnList = JsonPath.read(jsonObject, "$.store.book[*].isbn");
二、过滤器
1、当我们需要从列表中获取部分数据时,我们就要用到过滤器。过滤器提供了条件过滤和表达式过滤两种方式。
2、条件过滤语法:$.[?(condition)]
3、表达式过滤语法:$.[path][?(@.expression)]
// 找到价格低于10美元并且类型为fiction的书
List<Map<String, Object>> result = JsonPath.read(jsonObject, "$.store.book[?(@.price < 10 && @.category == 'fiction')]");
// 找到价格第二便宜的书
Map<String, Object> second = JsonPath.read(jsonObject, "$.store.book[?(@.price > $.store.book[*].price) &&(@.price <= "
+ "($.store.book[*].price.max() - $.store.book[*].price.min())/(@.length() - 1))][0]");
// 找到总价最高的书的作者
String author = JsonPath.read(jsonObject, "$.store.book.maxBy($.price * $.qty).author");
三、操作符
1、操作符用来比较、计算以及从匹配的结果中返回一个子集或第一个/最后一个元素等。
2、算术操作符:+
, -
, *
, /
, %
3、关系操作符:==
, !=
, >=
, <=
, >
, <
4、逻辑操作符:&&
, ||
, !
5、子集操作选择器:[]
// 按照价钱排序
List<Map<String, Object>> sortedBooks = JsonPath.read(jsonObject, "$.store.book[?(@.price)].sort($.price)");
// 按照book类别和书名排序
List<Map<String, Object>> sortedBooks = JsonPath.read(jsonObject, "$.store.book[?(@.price)].sort($.category, $.title)");
// 找到第一本书
Map<String, Object> firstBook = JsonPath.read(jsonObject, "$.store.book[0]");
// 找到第一本fiction类别的书的标题和作者
String titleAndAuthor = JsonPath.read(jsonObject, "$.store.book[?(@.category == 'fiction')].{title: @.title,author: @.author}");
四、函数
1、JSONPath函数可以执行大量的计算和数据操作,包括对字符串、数字、日期、数组、对象等这些常识类型的操作。
2、函数的语法是:$.functionName(param1, param2, ...)
3、函数分类:字符串函数、数字函数、数组函数、对象函数。
// 找到价格最便宜的一本书的价格
int cheapestPrice = JsonPath.read(jsonObject, "$.store.book.min($.price)");
// 找到第一本书的作者
String author1 = JsonPath.read(jsonObject, "$.store.book[0].author");
// 找到最后一本书的标题
String title1 = JsonPath.read(jsonObject, "$.store.book[-1:].title");
// 找到所有图书的总数量
int totalQty = JsonPath.read(jsonObject, "$.store.book.sum($.qty)");
// 找到最贵的书的作者和价格
String authorAndPrice = JsonPath.read(jsonObject, "$.store.book.maxBy($.price).{author: @.author, price: @.price}");