【问题标题】:JSONPath union of multiple different paths多个不同路径的 JSONPath 联合
【发布时间】:2019-04-03 14:39:12
【问题描述】:

我正在尝试构建一个单个 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 做同样的事情吗?

【问题讨论】:

    标签: json jsonpath


    【解决方案1】:

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

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

    Goessner 实现将返回

    [
       "John",
       "Nara"
    ]
    

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

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

    其中namecapacitymetadatastatus 的成员。

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

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

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

    少数 JSONPath 实现支持 bracket notation with two literals separated by dotbracket notation with two literals separated by dot without quotes

    jsoncons C++ library(自 0.161.0 起)支持 JSONPath 与符号完全分离的路径联合

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

    【讨论】:

    • 是的,我也到了这一点,但我想知道是否可以通过单个查询来查询不同的路径。
    • 作为C++ JsonPath implementation 的作者,我会说答案是否定的,严格解释spec,以至于它可以称为“规范”。这个问题之前已经提出,并且可以想象一个扩展。但我不知道有任何现有的实现。
    • 谢谢,所以,这可能是我的问题的答案。
    【解决方案2】:

    此答案不是 100% 的问题答案,因为它假定 nodejs/javascript。因为它描述了我们如何克服 JSONPath 的限制,所以我希望它可以帮助其他人。


    我们也有类似的要求。然而,我们需要寻找数百条不同的路径并为它们进行处理,而性能是一个实际问题。然后我们将 JSONPath 替换为 object-scan。它有点受限,但在需要进行数据处理时有一些优势。

    以下是解决问题的方法(请注意,您可以将编译和运行部分分开,以提高后续执行的性能):

    // const objectScan = require('object-scan');
    
    const data = { 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' }] };
    
    const r = objectScan(['firstName', 'address.city'], { rtn: 'count' })(data);
    
    console.log(r);
    // => 2
    .as-console-wrapper {max-height: 100% !important; top: 0}
    <script src="https://bundle.run/object-scan@13.8.0"></script>

    免责声明:我是object-scan的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多