You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:58:14