如何利用Josson库通过JSON中的filter节点动态过滤数据?
使用Josson实现动态替换过滤表达式中的变量
实现步骤
- 从JSON数据中提取预定义的过滤表达式、变量值以及目标数据集
- 将表达式中的变量占位符替换为JSON内对应的实际值(注意字符串类型的值需要包裹单引号,匹配Josson的语法要求)
- 使用替换后的合法表达式执行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
相关产品推荐
相关产品推荐

