You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jayway JsonPath中用OR条件匹配不同JSON字段

问题描述

我有以下两种JSON结构:

第一种:

{
  "class": [
    {
      "extension": [
        {
          "url": "example.com",
          "valueIdentifier": {
            "value": "myValue"
          }
        }
      ]
    }
  ]
}

第二种:

{
  "class": [
    {
      "extension": [
        {
          "url": "example.com",
          "valueString": "myValue"
        }
      ]
    }
  ]
}

我需要根据JSON结构获取对应的value或valueString的值。在XPath里可以用|运算符自动匹配正确的路径:

/*:class/*:extension[@url='example.com']/*:valueString/@value | /*:class/*:extension[@url='example.com']/*:valueIdentifier/*:value/@value

但用Jayway JsonPath引擎时,我试了几种写法都无效,比如:

$.class[0].extension[?(@.url=="example.com")].valueString || $.class[0].extension[?(@.url=="example.com")].valueIdentifier.value
$.class[0].extension[?(@.url=="example.com")]['valueString', 'valueIdentifier', 'value']
$.class[0].extension[?(@.url=="example.com")].[?(@.value)].[*]

请问有没有类似XPath的等效JsonPath表达式?


解决方案(基于Jayway JsonPath)

方法1:使用Union运算符

Jayway支持用||作为路径联合运算符,正确写法是将两个完整的匹配路径直接用||连接,就能实现类似XPath|的效果:

$.class[0].extension[?(@.url=="example.com")].valueString || $.class[0].extension[?(@.url=="example.com")].valueIdentifier.value

这个表达式会同时匹配两个路径,返回存在的那个值。

方法2:递归下降提取目标值

利用..递归下降语法,直接提取所有可能的目标节点:

$.class[0].extension[?(@.url=="example.com")]..valueString, $.class[0].extension[?(@.url=="example.com")]..valueIdentifier.value

这种写法会遍历指定节点下的所有层级,匹配到对应属性后返回值。

方法3:条件判断匹配

通过在路径中加入存在性判断,优先匹配存在的属性:

$.class[0].extension[?(@.url=="example.com")][?(@.valueString)].valueString || $.class[0].extension[?(@.url=="example.com")][?(@.valueIdentifier)].valueIdentifier.value

它会先检查valueString是否存在,存在则返回该值;否则匹配valueIdentifier.value。

以上三种写法在Jayway引擎中均可生效,能根据JSON结构自动返回对应的myValue值。

内容的提问来源于stack exchange,提问作者Aramka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19