如何使用JQ将多个JSON文件合并为适配PHP关联数组的JSON结构
解决JQ合并JSON为PHP适配的关联数组格式问题
你需要把多个独立的JSON对象,转换成以每个对象的DB字段值为键、原对象为值的单一JSON对象,这里有两种简洁高效的方法可以实现:
方法1:使用reduce直接处理每个输入对象
这个方法不需要先把所有对象拼成数组,而是逐个处理并构建目标对象,效率更高:
while read str; do parse_object_kv_list_json_non_eval "$str" done < "$USER_DATA/db.conf" | jq -n 'reduce inputs as $item ({}; .[$item.DB] = $item)'
原理说明:
-n参数让JQ不自动读取标准输入,而是通过inputs逐个获取每个处理后的JSON对象reduce从空对象{}开始迭代:- 每次取一个输入对象
$item - 以
$item.DB的值作为键,把整个$item对象作为值,添加到结果对象中
- 每次取一个输入对象
方法2:先构建数组再转换为对象
如果你更习惯用数组处理的思路,可以先把所有对象收集成数组,再转换成目标格式:
while read str; do parse_object_kv_list_json_non_eval "$str" done < "$USER_DATA/db.conf" | jq -s 'map({key: .DB, value: .}) | from_entries'
原理说明:
-s参数把所有输入的JSON对象合并成一个数组map({key: .DB, value: .})将数组中的每个对象转换为{key: "DB字段值", value: 原对象}的格式from_entries把这个键值对数组直接转换成一个单一的JSON对象,正好符合你需要的结构
修复你之前的尝试
如果你想基于你第二个命令的思路改进,只需要在最后加上add来合并数组里的所有小对象:
jq -s 'add' <<< $(while read str; do json=$(parse_object_kv_list_json_non_eval "$str") key=$(echo "$json" | jq -r '.DB') echo "{\"$key\":$json}" done < "$USER_DATA/db.conf")
不过这种方法需要额外调用一次JQ提取DB值,不如前面两种方法简洁高效,推荐优先使用前两种。
执行任意一种方法后,你都会得到符合要求的JSON结构:
{ "jaap_35290": { "DB": "jaap_35290", "DBUSER": "jaap_35290", "HOST": "localhost", "TYPE": "mysql", "CHARSET": "UTF8" }, "db_2": { "DB": "db_2", "DBUSER": "jaap_35290", "HOST": "localhost", "TYPE": "mysql", "CHARSET": "UTF8" } }
内容的提问来源于stack exchange,提问作者Jaap Marcus
相关产品推荐
相关产品推荐

