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

能否通过JMESPath实现嵌套对象转换?实操遇阻求助

问题分析

你的核心需求是按page_name分组,合并同一页面的时间戳和响应时间,但JMESPath本身没有内置的分组聚合功能,这是导致你现有查询返回null的根本原因——不仅嵌套上下文的过滤器无法正确匹配数据,更关键的是JMESPath无法自动完成分组去重的操作。

你当前查询的问题:在{ sourcesMap: { PageName: @, PageURL: results[?page_name==@].url } }中,@在嵌套结构里的上下文已经变成单个page_name值,但JMESPath的过滤器无法在这种映射操作中正确引用外部的results数组进行匹配,因此返回null。

解决方案

由于JMESPath不支持分组,建议结合Python代码完成分组逻辑,JMESPath负责基础数据提取,Python处理聚合:

步骤1:用JMESPath提取原始数据

先提取所有页面的关键字段,简化后续处理:

import jmespath

input_data = {
    "results": [
        {"page_name": "home", "url": "http://home.com", "time": 1625760290, "response_time": 120},
        {"page_name": "about", "url": "http://about.com", "time": 1625760390, "response_time": 150},
        {"page_name": "home", "url": "http://home.com", "time": 1625760490, "response_time": 100}
    ],
    "test_name": "Test1"
}

# 提取所有条目核心字段
extracted = jmespath.search("results[*].{page_name: page_name, url: url, time: time, response_time: response_time}", input_data)

步骤2:Python分组聚合

用字典按page_name分组,合并时间戳和响应时间:

grouped = {}
for item in extracted:
    key = item["page_name"]
    if key not in grouped:
        grouped[key] = {
            "sourcesMap": {
                "PageName": key,
                "PageURL": item["url"]
            },
            "timestamps": [],
            "values": []
        }
    grouped[key]["timestamps"].append(item["time"])
    grouped[key]["values"].append(item["response_time"])

# 构造最终结果
output = {
    "results": [
        {
            "metricId": "Response Time",
            "unit": "ms",
            "data": list(grouped.values())
        }
    ],
    "test_name": input_data["test_name"]
}

最终输出结果

运行后会得到你期望的格式:

{
  "results": [
    {
      "metricId": "Response Time",
      "unit": "ms",
      "data": [
        {
          "sourcesMap": {
            "PageName": "home",
            "PageURL": "http://home.com"
          },
          "timestamps": [1625760290, 1625760490],
          "values": [120, 100]
        },
        {
          "sourcesMap": {
            "PageName": "about",
            "PageURL": "http://about.com"
          },
          "timestamps": [1625760390],
          "values": [150]
        }
      ]
    }
  ],
  "test_name": "Test1"
}
替代方案(纯工具)

如果不想写代码,可以用支持分组的JSON处理工具,比如jq,对应的查询语句如下:

{
  "results": [
    {
      "metricId": "Response Time",
      "unit": "ms",
      "data": [
        .results
        | group_by(.page_name)[]
        | {
            sourcesMap: {PageName: .[0].page_name, PageURL: .[0].url},
            timestamps: [.[].time],
            values: [.[].response_time]
          }
      ]
    }
  ],
  "test_name": .test_name
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:44:50