深入理解javajsonpath

发布时间:2023-05-19

一、选择器

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}");