0

我想根据另一个对象的值(不是数组部分)选择数组元素

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

我想根据 的值选择数组元素$.conditionalField。我需要这样的东西:

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

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

4

2 回答 2

1

不幸的是,到目前为止,这还不能在 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'))
)

我们或许可以在 JavaScript 中使用 JSON-Path 并利用脚本 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
于 2020-12-08T19:26:25.453 回答
0

尝试这样的事情:

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

输出应该是:

[
   2
]
于 2020-09-24T20:20:06.273 回答