如何使用jq为JSON文件中的数据库配置添加servername值作为外层键名
JSON结构调整实现方案
方案选型
- 优先选择
jq作为实现工具,是处理该需求最简洁稳定的方案 - 不推荐使用awk、sed等文本处理工具:这类工具无法识别JSON结构化特性,一旦JSON的缩进、换行、空格排布发生变化,很容易生成无效的错误结果
前置说明
你提供的原始JSON存在语法错误:database_details字段下直接放置两个无键对象不符合JSON规范,合法的原始结构应为database_details字段对应存储数据库配置的数组,修正后的合法原始文件示例如下:
{ "database_details": [ { "age": "false", "help": "xxxx", "host": "", "servername": "fra02", "db_name": "config_tools", "pass": "xxxx", "user": "default" }, { "age": "false", "help": "xxxx", "host": "", "servername": "fra03", "db_name": "config_tools", "pass": "xxxx", "user": "default" } ] }
注:你提供的期望输出中fra03配置的servername字段值误写为fra02,后续方案会保留每个配置项原本的servername值,不会出现该错误
实现命令
假设原始合法JSON文件名为input.json,执行以下命令即可生成符合要求的结构:
jq '.database_details | map({(.servername): .}) | add as $new_db | .database_details = $new_db' input.json > output.json
命令逻辑说明
- 提取
database_details数组的所有元素 - 遍历每个元素,以元素自身的
servername字段值为键,元素本身为值组成新的键值对 - 将所有新生成的键值对合并为一个对象
- 用新生成的对象替换原来的
database_details字段值 - 最终结果输出到
output.json文件
内容的提问来源于stack exchange,提问作者MikeyR
相关产品推荐
相关产品推荐

