如何用JsonPath统一解析JSON中单个或数组形式的记录并提取ID?
如何用单个JsonPath表达式兼容单对象和数组类型的CVE字段?
我有一段JSON数据,其中CVE字段可能是单个记录对象,也可能是记录数组。需要提取所有记录的ID字段,汇总为包含1个或多个ID的数组。
输入1:单条记录
{ "CVE": { "ID": "CVE-2022-26138", "URL": "foo.bar" } }
输入2:多条记录数组
{ "CVE": [ { "ID": "CVE-2019-2969", "URL": "foo.com" }, { "ID": "CVE-2019-3030", "URL": "bar.com" } ] }
我尝试过以下两个JsonPath表达式,但都只能处理一种输入:
$.CVE.ID:对输入1返回["CVE-2022-26138"],但对输入2返回空数组$.CVE.*.ID:对输入1返回空数组[],但对输入2能得到正确结果["CVE-2019-2969", "CVE-2019-3030"]
请问是否存在一个能同时处理两种输入的JsonPath表达式?
可行的JsonPath表达式
使用表达式 $.CVE[*].ID 即可同时兼容两种输入场景。
效果验证:
- 针对输入1(单对象):
[*]操作符会将单个CVE对象视为单元素数组进行遍历,最终返回["CVE-2022-26138"] - 针对输入2(数组):
[*]遍历数组中的每个元素,提取各自的ID字段,返回["CVE-2019-2969", "CVE-2019-3030"]
补充说明
这个表达式的兼容性依赖于JsonPath实现对[*]操作符的处理逻辑——多数主流库(如Jayway JsonPath)会自动将非数组的单个对象转换为单元素数组来处理[*]遍历,因此能同时适配两种结构。
如果你的JsonPath实现不支持这种自动转换,也可以使用联合表达式 $.CVE.ID | $.CVE[*].ID(部分库支持|作为或操作符),该表达式会同时尝试匹配两种路径,最终合并有效结果。
内容的提问来源于stack exchange,提问作者Vijay Kumar
相关产品推荐
相关产品推荐

