JSON 基于另一个字段值的元素的路径条件索引

JSON path condifitional index of element based on value of another field

我想 select 数组元素基于另一个对象的值(不是数组部分)

{
  "array": [
    {
      "id": 1
    },
    {
      "id": 2
    }
  ],
  "conditionalField": "ab"
}

我想要 select 个基于 $.conditionalField 值的数组元素。我需要这样的东西:

$.array[($.conditionalField == "ab" ? 0 : 1)]

json路径是否支持这个?我使用 Jayway JSON Path

尝试这样的事情:

$.[?(@.conditionalField=="ab")].array[1].id

输出应该是:

[
   2
]

不幸的是,目前无法在 JSONPath 中完成此操作。通常,当前的实现缺乏 XPath 1.0 的流畅性(更不用说 v2.0/3+)了。

在像 XPath 1.0 这样的语言中模仿条件 (if-else) 的(众所周知的)技巧没有这种功能,它是使用一种称为“Becker 方法”的技术,即连接两个互斥的字符串,其中两个字符串之一根据条件变为空。在 (XPath) 伪代码中:

concat(
  substring('foo', 1, number(true) * string-length('foo')),
  substring('bar', 1, number(not(true)) * string-length('bar'))
)

我们可以使用 JSON-Path in JavaScript 并利用脚本 eval 来做到这一点;我认为它应该看起来像这样(为了更好的可读性而拆分):

$.[?(@.conditionalField && @.dict[0].id && @.dict[1].id && @.temp.concat( 
          @.dict[0].id.substring(0, @.conditionalField==='ab' * @.dict[0].id.length()) ) 
 .concat( @.dict[1].id.substring(0, @.conditionalField==='xy' * @.dict[1].id.length()) )
   )]

但它不起作用。所以,到目前为止,似乎没有办法直接在 JSON-Path 中模仿 if-else 结构。

一种实用的方法是分别选择这两个属性并在您的主机环境中做出决定:

$.[?(@.conditionalField=='ab')].dict[0].id
$.[?(@.conditionalField=='xy')].dict[1].id