1

我有一个与预期节点匹配的 JSONPath 表达式。但我想返回该节点父节点的属性。

这是源json:

{
  "totalRecords": 2,
  "totalRecordsSpecified": true,
  "recordList": [
      {
      "name": "34-34",
      "customFieldList": [
        {
          "value": {
            "name": "PANTS",
            "internalId": "46",
            "typeId": "91"
          },
          "internalId": "933",
          "scriptId": "custrecord_size_range",
          "_typeName": "SelectCustomFieldRef"
        }
      ],
      "internalId": "343",
      "_typeName": "CustomRecord"
    },
    {
      "name": "34-34",
      "customFieldList": [
        {
          "value": {
            "name": "JEANS",
            "internalId": "44",
            "typeId": "91"
          },
          "internalId": "933",
          "scriptId": "custrecord_size_range",
          "_typeName": "SelectCustomFieldRef"
        }
      ],
      "internalId": "321",
      "_typeName": "CustomRecord"
    }
  ]
}

这是 JSONPath 表达式:$.recordList[.customFieldList[?(@.value.name=='JEANS')]]

它返回以下匹配:

[
  {
    "value": {
      "name": "JEANS",
      "internalId": "44",
      "typeId": "91"
    },
    "internalId": "933",
    "scriptId": "custrecord_size_range",
    "_typeName": "SelectCustomFieldRef"
  }
]

但是,我要返回的是 PARENT 元素的 .internalId 属性,该属性包含customFieldList与上述元素匹配的数组。

也许通过屏幕截图:JSONPath 评估器

如何更改我的 JSONPath 表达式以返回指定的父属性?

4

1 回答 1

1

制定正确的语法以获得预期的结果归结为所应用的 JSONPath 库的实现细节。看起来您正在使用JsonPath-Plus库(因为您使用的是这个特定的在线测试器)。JsonPath-Plus 允许我们使用^父节点运算符上一层,即使用您的路径,我们可以执行以下操作:

$.recordList[.customFieldList[?(@.value.name=='JEANS')]]^^^.internalId

我们可以制定一个非常直接的路径,适用于Gatling实现(可能还有其他一些库),如下所示:

$.recordList[?(@.customFieldList[*].value.name=='JEANS')].internalId

我什至找到了一条适用于 Goessner 的基本 JavaScript JsonPath 实现的路径(有点怀疑为什么 index0会产生正确的结果;这可能不适用于多个结果,应该谨慎对待)

$.recordList[?(@.customFieldList[0].value.name=='JEANS')].internalId

您可以在此处使用各种 JSONPath 实现测试此路径(您可以在选项卡之间切换,然后单击 Go)。如您所见,这在很大程度上取决于您的环境或工具使用的底层库。

于 2021-08-25T23:02:02.023 回答