如何使用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
相关产品推荐
相关产品推荐

