使用 jq 获取所有嵌套键和值

Yog*_*ogi 2 bash json key-value jq

我有一个像这样的json

{
  "outer1": {
    "outer2": {
      "outer3": {
        "key1": "value1",
        "key2": "value2"
      }
    },
    "outer4": {
      "key1": "value1",
      "key2": "value2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望输出是

[outer1.outer2.outer3]
key1 = value1
key2 = value2

[outer1.outer2.outer4]
key1 = value1
key2 = value2
Run Code Online (Sandbox Code Playgroud)

我尝试过jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json但这不是我想要的

pmf*_*pmf 6

假设您的输入如下所示:

{
  "outer1": {
    "outer2": {
      "outer3": {
        "key1": "value1",
        "key2": "value2"
      },
      "outer4": {
        "key1": "value1",
        "key2": "value2"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用该--stream选项将输入读取为路径值对流。例如:

jq --stream -n '
  reduce (inputs | select(has(1))) as [$path, $val] ({};
    .[$path[:-1] | join(".")][$path[-1]] = $val
  )
'
Run Code Online (Sandbox Code Playgroud)
{
  "outer1.outer2.outer3": {
    "key1": "value1",
    "key2": "value2"
  },
  "outer1.outer2.outer4": {
    "key1": "value1",
    "key2": "value2"
  }
}
Run Code Online (Sandbox Code Playgroud)

接下来,根据您的需要格式化此 JSON。例如,用于to_entries两个级别:

jq --stream -nr '
  reduce (inputs | select(has(1))) as [$path, $val] ({};
    .[$path[:-1] | join(".")][$path[-1]] = $val
  )
  | to_entries[] | "[\(.key)]", (
      .value | to_entries[] | "\(.key) = \(.value)"
    ), ""
'
Run Code Online (Sandbox Code Playgroud)
[outer1.outer2.outer3]
key1 = value1
key2 = value2

[outer1.outer2.outer4]
key1 = value1
key2 = value2

Run Code Online (Sandbox Code Playgroud)