首页 > 解决方案 > 多个不同路径的 JSONPath 联合

问题描述

我正在尝试构建一个JSONPath 查询,它将测试是否存在两个或多个路径

让我们考虑以下示例文档:

{
          "firstName": "John",
          "lastName" : "doe",
          "age"      : 26,
          "address"  : {
            "streetAddress": "naist street",
            "city"         : "Nara",
            "postalCode"   : "630-0192"
          },
          "phoneNumbers": [
            {
              "type"  : "iPhone",
              "number": "0123-4567-8888"
            },
            {
              "type"  : "home",
              "number": "0123-4567-8910"
            }
          ]
}

到目前为止,我发现:

$..[firstName,lastName,type]

并从整个文档中获取所有这些元素。

但是,我需要检查两个不同的路径,例如:

 $.firstName 
 $.address.city

这可以通过单个 JSONPath 查询来完成吗?我不能写类似的东西:

$.[firstName,address.city]

使用 XML 和 XPath,我可以编写:

/person/firstname | /person/address/city

并获得所有匹配的 XML 元素的联合。

我可以对 JSONPath 做同样的事情吗?

标签: jsonjsonpath

解决方案


我认为最接近原始 JSONPath 的方法是使用递归下降和联合,即

$..['firstName','city']

Goessner 实现将返回

[
   "John",
   "Nara"
]

kubernetes JSONPath支持联合运算符的扩展,允许

[‘metadata.name’, ‘status.capacity’]

其中name和是和capacity的成员。metadatastatus

JSONMatch是 JSONPath 的一个变种,最初基于 Kubernetes JSONPath 解析器,支持完全独立路径的联合,例如

[employee[5].name, company.name, wageTiers[compensation > 10000]]

JSONMatch 在go中可用,我也相信javascript

少数 JSONPath 实现支持括号表示法,两个文字用点分隔括号表示法,两个文字用点分隔,不带引号

jsoncons C++ 库(自 0.161.0 起)支持带有符号的完全独立路径的 JSONPath 联合

$..['firstName',@.address.city]

推荐阅读