如何为可同时作为数组的对象定义JSON Path表达式
JSON Path 提取非数组类型的邮箱地址
问题背景
我有一份第三方提供的JSON数据,正在使用JSON Path进行数据转换。数据示例如下:
{ "Traveller": [ { "FirstName": "Passenger", "LastName": "One", "EmailAddresses": { "Email": { "EmailAddress": [ "one_001@anvilgroup.com", "one_002@anvilgroup.com" ] } } }, { "FirstName": "Passenger", "LastName": "Two", "EmailAddresses": { "Email": { "EmailAddress": "two_001@anvilgroup.com" } } } ] }
使用表达式 $..Traveller[*].EmailAddresses.Email.EmailAddress[*] 可以正常获取数组形式的邮箱地址:
[ "one_001@anvilgroup.com", "one_002@anvilgroup.com" ]
但我需要仅返回 "two_001@anvilgroup.com" 的表达式,尝试过以下表达式但无法得到预期结果:
$..Traveller[*].EmailAddresses.Email.EmailAddress.* $..Traveller[*].EmailAddresses.Email.EmailAddress[2]
我判断需要通过过滤定位非数组类型的EmailAddress字段。
解决方案
方案1:基于类型过滤(通用兼容)
如果你的JSON Path实现支持类型判断(如Jayway JsonPath),可以使用过滤器筛选出EmailAddress不是数组的节点:
$..Traveller[*].EmailAddresses.Email[?(!(@.EmailAddress instanceof Array))].EmailAddress
逻辑说明:
- 遍历所有
Traveller节点下的EmailAddresses.Email对象 - 通过
?()过滤器判断当前对象的EmailAddress属性不是数组类型 - 提取符合条件的
EmailAddress值,最终得到目标邮箱"two_001@anvilgroup.com"
方案2:索引直接定位(结构固定时使用)
如果第三方数据的Traveller数组顺序固定,第二个元素始终是目标乘客,直接通过索引定位更高效:
$..Traveller[1].EmailAddresses.Email.EmailAddress
注意:此方法依赖数据结构的固定顺序,若Traveller元素顺序可能变化,优先使用方案1。
内容的提问来源于stack exchange,提问作者Dev Team
相关产品推荐
相关产品推荐

