如何使用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
相关产品推荐
相关产品推荐

