
本文详解如何在 josson 库中正确使用类似 sql `in` 的过滤逻辑(实际通过 `contains()` 实现),解决因表达式误写和 jackson 版本冲突导致的 `nosuchmethoderror` 问题,并提供可运行的 java 示例与关键注意事项。
Josson 是一个轻量级、基于 Jackson 的 JSON 查询与转换库,支持类 XPath/JSONPath 的表达式语法。但需注意:Josson 并不原生支持 x in (y) 这类 SQL 风格语法;其等效逻辑应使用 array.contains(value) 方法——即判断某值是否存在于目标数组中。
在你的原始表达式中:
"filter": "data[$.sourceData.series in (motorSeries)].CSDtemplateName"
该写法存在两个关键问题:
- 语法错误:in 不是 Josson 支持的操作符,会引发解析异常或误判节点关系;
- 路径逻辑错误:$.sourceData.series.in(motorSeries) 被解析为尝试在 sourceData.series 节点下查找名为 in 的子字段,而 motorSeries 并非其子节点,导致语义错乱。
✅ 正确写法应为:
"filter": "data[motorSeries.contains($.sourceData.series)].CSDtemplateName"
此表达式含义清晰:遍历 data 数组,对每个元素检查其 motorSeries 字段(必须是 JSON 数组)是否包含 $.sourceData.series 的值,若匹配则提取 CSDtemplateName。
以下是完整、可直接运行的 Java 示例(已适配 Josson 1.5+ 与 Jackson 2.14+):
import com.octomix.josson.Josson;
public class JossonInFilterExample {
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": "LX PLUS (S)"
},
"filter": "data[motorSeries.contains($.sourceData.series)].CSDtemplateName"
}
""";
Josson josson = Josson.fromJsonString(json);
Object result = josson.getNode("eval(filter)");
System.out.println(result); // 输出: "ABC"
}
}⚠️ 重要注意事项:
-
Jackson 版本兼容性:Josson ≥1.5 依赖 Jackson Databind 2.14.1+。若项目中已引入旧版 Jackson(如 2.9.x 或 2.12.x),需显式升级至 2.14.1 或更高版本,否则将抛出 NoSuchMethodError: JsonNode.isEmpty()(因 isEmpty() 方法在 2.14+ 中才被添加)。Maven 依赖示例:
com.fasterxml.jackson.core jackson-databind 2.14.3 com.octomix.josson josson 1.5.0 数据类型严格性:motorSeries 必须是 JSON 数组(JsonArray),不能是字符串或 null;$.sourceData.series 必须为字符串(JsonString),否则 contains() 比较可能返回 false 或抛出 ClassCastException。建议在生产环境做前置校验。
-
空值安全:若 motorSeries 可能为 null,可改用安全调用形式:
data[motorSeries != null && motorSeries.contains($.sourceData.series)].CSDtemplateName
总结:Josson 中实现“IN”语义的核心是 array.contains(value),而非模仿 SQL 的 in 关键字;同时务必确保 Jackson 版本与 Josson 兼容。掌握这一模式后,即可高效完成复杂嵌套 JSON 的条件筛选任务。










