如何用JayWay JsonPath实现非空优先的JSON值条件提取?
解决JsonPath实现优先取值的问题
问题背景
给定如下JSON:
{ "A":{ "C":{ "date":"2022-01-23" } }, "B":{ "D":{ "date":"2022-01-24" } } }
需要实现:优先提取$.A.C.date的值,若该值不为null则使用它;否则提取$.B.D.date的值。
你之前尝试的问题分析
你使用的$.[?()]语法是用来筛选数组元素的,但当前JSON的根节点是对象而非数组,因此这类表达式无法正确匹配目标值,要么返回空数组,要么返回整个根对象,达不到条件取值的目的。
解决方案
方案1:分两次读取(最直观易维护)
先尝试读取$.A.C.date,若结果为null则读取备用值:
String json = "{\"A\":{\"C\":{\"date\":\"2022-01-23\"}},\"B\":{\"D\":{\"date\":\"2022-01-24\"}}}"; // 优先读取A.C.date String targetDate = JsonPath.read(json, "$.A.C.date"); // 若为null则读取B.D.date if (targetDate == null) { targetDate = JsonPath.read(json, "$.B.D.date"); } System.out.println(targetDate); // 输出:2022-01-23
方案2:使用脚本表达式(单次读取)
Jayway JsonPath支持通过Groovy脚本实现三元运算符逻辑,直接在表达式中完成条件判断:
String json = "{\"A\":{\"C\":{\"date\":\"2022-01-23\"}},\"B\":{\"D\":{\"date\":\"2022-01-24\"}}}"; String expression = "$.A.C.date != null ? $.A.C.date : $.B.D.date"; String targetDate = JsonPath.read(json, expression); System.out.println(targetDate); // 输出:2022-01-23
如果遇到脚本执行限制,可显式配置允许脚本:
Configuration config = Configuration.defaultConfiguration(); String targetDate = JsonPath.using(config).parse(json).read(expression);
注意事项
- 若
A.C本身可能不存在(而非date为null),需要先判断节点是否存在,可结合JsonPath.exists()方法:if (!JsonPath.exists(json, "$.A.C.date")) { targetDate = JsonPath.read(json, "$.B.D.date"); }
内容的提问来源于stack exchange,提问作者Matteo NNZ
相关产品推荐
相关产品推荐

