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

如何利用Josson库通过JSON中的filter节点动态过滤数据?

使用Josson实现动态替换过滤表达式中的变量

实现步骤

  1. 从JSON数据中提取预定义的过滤表达式、变量值以及目标数据集
  2. 将表达式中的变量占位符替换为JSON内对应的实际值(注意字符串类型的值需要包裹单引号,匹配Josson的语法要求)
  3. 使用替换后的合法表达式执行Josson查询

代码示例

假设你的输入JSON结构如下:

{
  "filter": "data[pumpSeries=pumpType & selectionType.contains(selectionType)].motorSeries",
  "pumpType": "BPH",
  "selectionType": "C",
  "data": [
    {"pumpSeries": "BPH", "selectionType": "C", "motorSeries": "MS1"},
    {"pumpSeries": "APH", "selectionType": "D", "motorSeries": "MS2"}
  ]
}

对应的Java实现代码:

import com.octomix.josson.Josson;

public class DynamicFilterExample {
    public static void main(String[] args) {
        String jsonInput = """
            {
              "filter": "data[pumpSeries=pumpType & selectionType.contains(selectionType)].motorSeries",
              "pumpType": "BPH",
              "selectionType": "C",
              "data": [
                {"pumpSeries": "BPH", "selectionType": "C", "motorSeries": "MS1"},
                {"pumpSeries": "APH", "selectionType": "D", "motorSeries": "MS2"}
              ]
            }
        """;
        
        // 初始化Josson实例
        Josson josson = Josson.fromJsonString(jsonInput);
        
        // 提取过滤表达式和变量值
        String rawFilter = josson.getString("filter");
        String pumpTypeValue = josson.getString("pumpType");
        String selectionTypeValue = josson.getString("selectionType");
        
        // 替换变量,为字符串值添加单引号以符合Josson语法
        String resolvedFilter = rawFilter
                .replace("pumpType", "'" + pumpTypeValue + "'")
                .replace("selectionType", "'" + selectionTypeValue + "'");
        
        // 执行查询并输出结果
        Object result = josson.getQuery(resolvedFilter);
        System.out.println(result); // 输出 ["MS1"]
    }
}

关键注意事项

  • 转义特殊字符:如果变量值包含单引号(比如O'Neil),需要先转义为O\'Neil,避免破坏表达式语法,可以用pumpTypeValue.replace("'", "\\'")处理
  • 变量类型适配:如果变量是数值类型(如整数、浮点数),不需要包裹单引号,需根据实际类型判断处理方式
  • 模板化优化:可以提前将JSON中的filter字段修改为模板格式,比如data[pumpSeries='${pumpType}' & selectionType.contains('${selectionType}')].motorSeries,然后利用Josson的字符串插值功能直接解析,简化替换逻辑:
    String resolvedFilter = josson.evaluateToString("filter", null);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:05:42