使用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)"));
错误原因
- Jackson版本不兼容:
JsonNode.isEmpty()方法是Jackson 2.9及以上版本新增的API,若项目依赖的Jackson版本低于该版本,会触发此方法找不到的错误,Josson内部依赖该方法完成JSON节点判断。 - 过滤语法错误:原代码中使用了
$.sourceData.series.in(motorSeries)的错误语法,Josson中判断元素是否在数组中的正确语法是value in array。 - 字符串匹配不精准:原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
相关产品推荐
相关产品推荐

