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

如何使用jq实现每个根级对象键单独占一行输出?

需求说明

需要将JSON文件以紧凑模式(-c)压缩,但让每个根级键值对单独占一行,同时保留首尾大括号。

示例输入:

{
  "a": {
    "a1": 1,
    "a2": [
      null
    ]
  },
  "b": {
    "b1": "test"
  },
  "c": [
    1,
    2,
    3
  ]
}

期望输出:

{
"a":{"a1":1,"a2":[null]},
"b":{"b1":"test"},
"c":[1,2,3]
}
已有尝试

已通过jq实现每行输出单个根级键值对:

echo '{"a":{"a1":1, "a2":[null]}, "b": {"b1":"test"}, "c": [1,2,3]}' | jq -c -r '. | to_entries | .[] | "\"\(.key)\": \(.value)"'

输出结果:

"a": {"a1":1,"a2":[null]}
"b": {"b1":"test"}
"c": [1,2,3]

但无法将这些条目组合成一个有效的完整JSON对象。

解决方案

方法1:纯jq实现

无需额外工具,利用jq的字符串拼接和join功能直接生成目标格式:

jq -r 'to_entries | map("\(.key):\(.value|tostring)") | "{\\n\(join(",\n"))\\n}"' input.json

方法2:jq+Perl组合实现(自行验证可行的方案)

先通过jq处理每个根级键值对,再用Perl拼接为完整的JSON结构:

echo '{"a":{"a1":1, "a2":[null]}, "b": {"b1":"test"}, "c": [1,2,3]}' | jq -c -r '. | to_entries | .[] | @json "\(.key): \(.value)"' | perl -pe 's/$/,/m if !eof' | perl -p0e 's/^/{\n/' | perl -p0e 's/$/\n}/'

内容的提问来源于stack exchange,提问作者FangQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:14:52