JSONPath如何过滤嵌套数组?根据指定planId获取对应skuId
解答
这个嵌套数组过滤查询需求完全可以通过JsonPath实现,不需要额外复杂的替代方案。
可用JsonPath表达式
针对你给出的示例数据,匹配目标planId对应skuId的JsonPath写法如下:
$.[?(@.plans[*].plan.planId == 'loks3123')].skuId
如果需要动态匹配不同的planId,只需要把表达式里的'loks3123'替换成目标planId的实际值即可。
表达式逻辑说明
$指代JSON的根节点,也就是你数据里最外层的sku数组[?(过滤条件)]是JsonPath的过滤器语法,会遍历根数组下的每一个sku对象,筛选符合条件的项- 过滤条件
@.plans[*].plan.planId == 'loks3123':对当前遍历到的sku对象,检查其plans数组下所有子项嵌套的plan.planId字段,只要存在值等于目标值,就判定当前sku匹配 - 末尾的
.skuId表示提取所有匹配到的sku对象的skuId字段
在你给出的示例数据上执行该表达式,返回结果为["1234"],和预期结果一致。
兼容性与替代方案
绝大多数主流JsonPath实现(包括Jayway JsonPath、JsonPath-Plus等各语言常用库)都支持上述写法。如果你使用的是非常老旧的JsonPath库、不支持过滤条件内直接嵌套数组通配匹配,直接用原生遍历处理即可:
将JSON反序列化为对应编程语言的原生对象/结构体,做两层遍历:先遍历外层sku列表,对每个sku遍历其下的plans数组,找到planId等于目标值的项时,直接返回当前sku的skuId即可。这种方案逻辑简单无额外依赖,性能也没有额外损耗,比硬凑不兼容的JsonPath写法更稳妥。
内容的提问来源于stack exchange,提问作者peter Char
相关产品推荐
相关产品推荐

