我有一个 json 结构,我尝试使用 JSONPath 表达式来匹配所有 cpe_match 节点。
使用databricks sql,我有以下查询,其中“nodes”包含我的json:
select to_json(nodes):[*].cpe_match
from cve_raw
这会导致
[[]]
根据 JSON 正确评估
$.[*].cpe_match
找到 3 个匹配项。为什么 databricks 给出不同的结果?我做错了什么?
示例 json:
[
{
"children":[
{
"children":[
],
"cpe_match":[
{
"cpe23Uri":"cpe:2.3:a:paloaltonetworks:cortex_xdr_agent:*:*:*:*:critical_environment:*:*:*",
"cpe_name":[
],
"versionEndExcluding":"7.5.101",
"versionEndIncluding":null,
"versionStartIncluding":"7.5",
"vulnerable":true,
"versionStartExcluding":null
}
],
"operator":"OR"
},
{
"children":[
],
"cpe_match":[
{
"cpe23Uri":"cpe:2.3:o:microsoft:windows:-:*:*:*:*:*:*:*",
"cpe_name":[
],
"versionEndExcluding":null,
"versionEndIncluding":null,
"versionStartIncluding":null,
"vulnerable":false,
"versionStartExcluding":null
}
],
"operator":"OR"
}
],
"cpe_match":[
],
"operator":"AND"
} ]
[*] 表达式标识数组中的所有节点。它不代表“任何属性通配符”。我已经简化了您的 JSON 一些内容以显示它正在做什么:
DECLARE OR REPLACE VARIABLE sample_json STRING DEFAULT
'[
{
"children":
[
{
"children":[],
"cpe_match":["1"]
},
{
"children":[],
"cpe_match":["2"]
}
],
"cpe_match":["3"]
}
]';
select
sample_json:[*].cpe_match, --[["3"]]
sample_json:[*].children[*].cpe_match --[[["1"],["2"]]]
我不知道这是否是故意的,但你在 JSON 结构中的不同级别都有 cpe_match 。如果您尝试对名称为 cpe_match 的任何属性进行更多通配符匹配,我认为 Databrick 的 JSON 路径表达式不可能做到这一点。