You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:35:16