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

Java中动态生成无硬编码的JsonPath表达式方案咨询

动态构建JsonPath实现多条件筛选(Java)

核心思路

将筛选条件(国家代码、房间数)作为参数传入,动态拼接JsonPath表达式替代硬编码字符串。核心利用in操作符匹配多值,用&&连接多条件,最终生成符合需求的筛选路径。

代码实现(基于Jayway JsonPath库)

import com.jayway.jsonpath.JsonPath;
import java.util.List;
import java.util.stream.Collectors;

public class DynamicJsonPathBuilder {

    // 构建带国家代码和房间数筛选的JsonPath
    public static String buildApartmentFilterPath(List<String> targetCountries, List<Integer> targetRooms) {
        // 生成国家代码的IN条件(处理单引号转义)
        String countryInClause = targetCountries.stream()
                .map(code -> "'" + code.replace("'", "\\'") + "'")
                .collect(Collectors.joining(",", "[", "]"));

        // 生成房间数的IN条件
        String roomInClause = targetRooms.stream()
                .map(String::valueOf)
                .collect(Collectors.joining(",", "[", "]"));

        // 组装完整表达式
        return String.format("$[?(@.country in %s && @.roomCount in %s)]", countryInClause, roomInClause);
    }

    // 测试示例
    public static void main(String[] args) {
        // 模拟用户选择的筛选条件
        List<String> selectedCountries = List.of("IN", "ENG");
        List<Integer> selectedRooms = List.of(1, 2);

        String dynamicPath = buildApartmentFilterPath(selectedCountries, selectedRooms);
        System.out.println("生成的JsonPath: " + dynamicPath);
        // 输出结果:$[?(@.country in ['IN','ENG'] && @.roomCount in [1,2])]

        // 后续可使用该路径解析JSON数据
        // String jsonData = "..."; // 你的JSON数据源
        // List<Object> filteredApartments = JsonPath.read(jsonData, dynamicPath);
    }
}

扩展优化:处理空筛选条件

如果需要支持部分条件为空的场景(比如用户只选国家或只选房间数),可调整代码自动忽略空条件:

public static String buildFlexibleFilterPath(List<String> targetCountries, List<Integer> targetRooms) {
    StringBuilder conditionBuilder = new StringBuilder();

    // 拼接国家代码条件(非空时)
    if (!targetCountries.isEmpty()) {
        String countryInClause = targetCountries.stream()
                .map(code -> "'" + code.replace("'", "\\'") + "'")
                .collect(Collectors.joining(",", "[", "]"));
        conditionBuilder.append("@.country in ").append(countryInClause);
    }

    // 拼接房间数条件(非空时,前面已有条件则加&&)
    if (!targetRooms.isEmpty()) {
        if (conditionBuilder.length() > 0) {
            conditionBuilder.append(" && ");
        }
        String roomInClause = targetRooms.stream()
                .map(String::valueOf)
                .collect(Collectors.joining(",", "[", "]"));
        conditionBuilder.append("@.roomCount in ").append(roomInClause);
    }

    // 无筛选条件时返回所有记录
    if (conditionBuilder.isEmpty()) {
        return "$";
    }

    return String.format("$[?(%s)]", conditionBuilder.toString());
}

注意事项

  • 字符转义:如果国家代码包含单引号,必须转义为\',避免破坏JsonPath语法。
  • 库兼容性:不同JsonPath库(如Jayway、Spring JsonPath)语法基本一致,但需确认in操作符的支持情况。
  • 参数校验:建议在方法开头校验参数非null,避免空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:34:56