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

如何使用Jayway JSONPath实现大小写不敏感的键名取值

问题说明

需要实现键名大小写不敏感的JSONPath查询:针对如下JSON结构,不管authors节点下的目标键是Robert.C.M、ROBERT.C.M还是robert.c.m这类任意大小写组合(键名中的.为固定必填组成部分),都能通过同一条查询拿到对应的值Clean Code。

{
    "authors":{
        "Robert.C.M": "Clean Code",
        "Martin.F": "Refactoring"
    }
}

初始使用精确匹配路径.authors['Robert.C.M']只能命中大小写完全一致的键,无法满足需求。查阅Jayway JSONPath文档时仅找到针对值的忽略大小写正则匹配写法(示例:$..book[?(@.author =~ /.*REES/i)]),未找到直接将正则逻辑应用于键名匹配的原生能力,无法直接通过原生JSONPath语法实现键名大小写不敏感匹配。

落地实现方案

Jayway JSONPath没有提供键名忽略大小写匹配的原生语法,采用「JSONPath拉取父节点+代码层归一化匹配」的方案实现,稳定性和兼容性更好:

  • 首先通过JSONPath拉取authors整个节点的全量内容,使用查询路径:
$.authors
  • 内部库会将JSONPath返回的节点内容转换为Map结构,在代码层对Map的键做归一化处理:将所有键统一转为小写,查询时传入的目标键也同步转为小写后再做匹配,即可实现忽略大小写的键命中,同时不会丢失键名中.这类固定字符的匹配校验。

对应Java实现代码如下:

import java.util.Map;
import java.util.stream.Collectors;

public class Demo {

    public static void main(String[] args) {
        Map<String, String> normalized = Map.of("ROBERT.C.M", "Clean Code")
                .entrySet()
                .stream()
                .collect(Collectors.toMap(
                        e -> e.getKey().toLowerCase(),
                        Map.Entry::getValue)
                );

        String theBook = normalized.get("RoBeRt.C.m".toLowerCase());
        System.out.println("theBook: " + theBook);

    }
}

该方案不会因为JSONPath版本迭代出现语法兼容问题,匹配逻辑完全可控,能避免正则匹配键名可能出现的误匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:03:20