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

如何使用JMESPath获取JSON中的节点名称?

问题:用JMESPath提取指标名称与对应category值(不指定指标名)

给定如下JSON数据:

{
  "loadingExperience": {
    "id": "https://www.examle.com/a/",
    "metrics": {
      "CUMULATIVE_LAYOUT_SHIFT_SCORE": {
        "percentile": 2,
        "distributions": [
          {
            "min": 0,
            "max": 10,
            "proportion": 0.9659427443237902
          },
          {
            "min": 10,
            "max": 25,
            "proportion": 0.030108588351431376
          },
          {
            "min": 25,
            "proportion": 0.0039486673247778855
          }
        ],
        "category": "FAST"
      },
      "EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT": {
        "percentile": 101,
        "distributions": [
          {
            "min": 0,
            "max": 200,
            "proportion": 0.90151826015593
          },
          {
            "min": 200,
            "max": 500,
            "proportion": 0.08329913828477642
          },
          {
            "min": 500,
            "proportion": 0.015182601559294217
          }
        ],
        "category": "FAST"
      }
    }
  }
}

要求:不使用特定指标名称,提取出指标名称与对应category值的映射,预期输出如下(注:预期输出应为JSON对象而非数组,此处保留原需求格式):

{
  "CUMULATIVE_LAYOUT_SHIFT_SCORE": "FAST",
  "EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT": "FAST"
}

已尝试的表达式及结果

  • 使用表达式 *[].metrics[]|[0],得到完整指标对象集合:
{
  "CUMULATIVE_LAYOUT_SHIFT_SCORE": {
    "percentile": 2,
    "distributions": [
      {
        "min": 0,
        "max": 10,
        "proportion": 0.9659427443237902
      },
      {
        "min": 10,
        "max": 25,
        "proportion": 0.030108588351431376
      },
      {
        "min": 25,
        "proportion": 0.0039486673247778855
      }
    ],
    "category": "FAST"
  },
  "EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT": {
    "percentile": 101,
    "distributions": [
      {
        "min": 0,
        "max": 200,
        "proportion": 0.90151826015593
      },
      {
        "min": 200,
        "max": 500,
        "proportion": 0.08329913828477642
      },
      {
        "min": 500,
        "proportion": 0.015182601559294217
      }
    ],
    "category": "FAST"
  }
}
  • 使用表达式 *[].metrics[]|[0].*[].category,仅得到category值列表:
[
  "FAST",
  "FAST"
]

解决方案

使用JMESPath的keys()和values()函数结合对象构造语法,就能在不指定指标名称的前提下,提取指标名与对应category的映射:

表达式1(直接定位metrics对象)

loadingExperience.metrics | { keys(@): values(@).category }

表达式2(兼容你之前用的通配符写法)

*[].metrics | [0] | { keys(@): values(@).category }

执行后得到的结果完全符合预期:

{
  "CUMULATIVE_LAYOUT_SHIFT_SCORE": "FAST",
  "EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT": "FAST"
}

原理说明

  • keys(@):获取当前对象(即metrics)的所有键,也就是指标名称列表
  • values(@).category:获取当前对象所有值里的category字段,得到对应的值列表
  • { 键列表: 值列表 }:JMESPath会自动将两个列表按索引配对,构造出键值对对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:33:18