databricks JSONPath 通配符缺少结果

问题描述 投票:0回答:1

我有一个 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"

} ]

databricks jsonpath databricks-sql aws-databricks
1个回答
0
投票

[*] 表达式标识数组中的所有节点。它不代表“任何属性通配符”。我已经简化了您的 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 路径表达式不可能做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.