如何使用jq提取JSON中所有嵌套键值对并按指定格式输出?
问题
现有JSON数据:
{ "outer1": { "outer2": { "outer3": { "key1": "value1", "key2": "value2" } }, "outer4": { "key1": "value1", "key2": "value2" } } }
期望输出格式:
[outer1.outer2.outer3] key1 = value1 key2 = value2 [outer1.outer4] key1 = value1 key2 = value2
之前尝试的jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json无法得到目标格式,求正确的jq实现方案。
解决方案
使用以下jq命令即可生成符合要求的输出:
jq -r ' def collect_object_paths: def recurse($current_path): . as $obj | if type == "object" then if ($obj | to_entries | length > 0) then $current_path end, ($obj | to_entries[] | .key as $k | ($obj[$k] | recurse($current_path + [$k]))) else empty end; recurse([]); [collect_object_paths[] | select(length > 1)] as $target_paths | foreach $target_paths[] as $path ( {}; .path_str = ($path | join(".")) | .content = getpath($path); "[" + .path_str + "]", (.content | to_entries[] | "\(.key) = \(.value)"), "" ) ' test.json
说明
collect_object_paths自定义函数:递归遍历整个JSON结构,收集所有包含子键值对的对象的完整路径。- 筛选目标路径:排除最顶层的
outer1路径,只保留包含具体键值对的子对象路径(即outer1.outer2.outer3和outer1.outer4)。 - 生成输出格式:对每个目标路径,先输出带方括号的路径字符串,再逐行输出该对象下的键值对,最后用空行分隔不同对象块。
内容的提问来源于stack exchange,提问作者Yogi
相关产品推荐
相关产品推荐

