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

使用Josson库的IN子句过滤数据报错求助

问题:使用Josson的IN子句过滤数据时出现NoSuchMethodError错误

问题详情

我需要用Josson库的IN子句实现数据过滤,期望输出为"ABC",但运行代码时抛出错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.JsonNode.isEmpty()Z

提供的JSON文件:

{
  "data": [
    {
      "motorSeries": [
        "UMT O (S)",
        "LX PLUS (S)",
        "XUMA DX (S)",
        "UMAI 100",
        "UMA (ULTIMA)"
      ],
      "CSDtemplateName": "ABC"
    },
    {
      "motorSeries": [
        "A",
        "B"
      ],
      "CSDtemplateName": "XYZ"
    }
  ],
  "sourceData": {
    "series": "UMT O (S)"
  },
  "filter": "data[$.sourceData.series in (motorSeries)].CSDtemplateName"
}

原Java代码:

String json = "{\"data\":[{\"motorSeries\":[\"UMTO(S)\",\"LXPLUS(S)\",\"XUMADX(S)\",\"UMAI100\",\"UMA(ULTIMA)\"],\"pumpModel\":\"CORA-12C\",\"CSDtemplateName\":\"CSD_CORA-100_12C.dxf\"}],\"sourceData\":{\"series\":\"LXPLUS(S)\",\"pumpModel\":\"CORA-12C\"},\"filter\":\"data[$.sourceData.series.in(motorSeries)].CSDtemplateName\"}";
Josson josson = Josson.fromJsonString(json);

System.out.println(josson.getNode("eval(filter)"));

错误原因

  1. Jackson版本不兼容:JsonNode.isEmpty()方法是Jackson 2.9及以上版本新增的API,若项目依赖的Jackson版本低于该版本,会触发此方法找不到的错误,Josson内部依赖该方法完成JSON节点判断。
  2. 过滤语法错误:原代码中使用了$.sourceData.series.in(motorSeries)的错误语法,Josson中判断元素是否在数组中的正确语法是value in array。
  3. 字符串匹配不精准:原Java代码中的JSON字符串将motorSeries中的带空格值(如"UMT O (S)")写成了无空格的"UMTO(S)",导致即使语法正确也无法匹配到目标数据。

解决方案

1. 统一Jackson依赖版本

确保项目中Jackson Core、Databind、Annotations的版本一致且不低于2.9。以Maven为例,在pom.xml中添加或修改依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.15.2</version>
</dependency>

若有其他依赖引入低版本Jackson,需排除这些冲突依赖。

2. 修正过滤语法与数据匹配

调整过滤表达式为正确的in语法,并确保JSON字符串中的值与目标数据一致。

修正后的完整代码

import com.octomix.josson.Josson;

public class JossonFilterDemo {
    public static void main(String[] args) {
        String json = "{\"data\":[{\"motorSeries\":[\"UMT O (S)\",\"LX PLUS (S)\",\"XUMA DX (S)\",\"UMAI 100\",\"UMA (ULTIMA)\"],\"CSDtemplateName\":\"ABC\"},{\"motorSeries\":[\"A\",\"B\"],\"CSDtemplateName\":\"XYZ\"}],\"sourceData\":{\"series\":\"UMT O (S)\"},\"filter\":\"data[$.sourceData.series in motorSeries].CSDtemplateName\"}";
        Josson josson = Josson.fromJsonString(json);
        
        System.out.println(josson.getNode("eval(filter)"));
    }
}

运行结果

执行修正后的代码,输出符合预期:

"ABC"

内容的提问来源于stack exchange,提问作者Pranav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45