如何在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
相关产品推荐
相关产品推荐

