如何使用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
相关产品推荐
相关产品推荐

