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

如何为可同时作为数组的对象定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:55:08