能否通过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
相关产品推荐
相关产品推荐

