如何使用JMESPath替换JSON中的指定格式键名
使用JMESPath批量重命名JSON中的特定键名
针对你提供的JSON结构,要批量将contents对象中所有格式为Prop_NNN的键名替换为NNN,同时保留其他结构不变,可以使用以下JMESPath表达式实现:
{ aaa: aaa, bbb: bbb, Date: Date, ccc: ccc, ddd: ddd, contents: merge( # 保留contents中不以Prop_开头的键值对 contents.*|keys(@)|[?starts_with(@, 'Prop_') == `false`]|{@: contents[@]}, # 处理Prop_开头的键,提取下划线后的部分作为新键 contents.*|keys(@)|[?starts_with(@, 'Prop_')]|{split('_', @)[1]: contents[@]} ) }
表达式说明
- 顶级键(
aaa/bbb/Date/ccc/ddd)直接原样映射,保持原有值不变。 - 处理
contents对象时,通过merge合并两组结果:- 第一组筛选出
contents中不以Prop_开头的键,生成对应的键值对保留。 - 第二组筛选出以
Prop_开头的键,用split('_', @)[1]拆分键名并提取下划线后的部分作为新键,对应值保持不变。
- 第一组筛选出
使用示例
假设你的JSON文件名为input.json,使用支持JMESPath的命令行工具(如jp)执行以下命令即可得到预期输出:
jp -f input.json "{aaa: aaa, bbb: bbb, Date: Date, ccc: ccc, ddd: ddd, contents: merge(contents.*|keys(@)|[?starts_with(@, 'Prop_') == `false`]|{@: contents[@]}, contents.*|keys(@)|[?starts_with(@, 'Prop_')]|{split('_', @)[1]: contents[@]})}"
预期输出
{ "aaa": 5, "bbb": 41, "Date": "2024-02-29T16:00:33.994Z", "ccc": 1, "ddd": 1, "contents": { "aaa": "Order1", "201": 788, "202": 839 } }
内容的提问来源于stack exchange,提问作者agm
相关产品推荐
相关产品推荐

