我有一个这样的json

{
  "outer1": {
    "outer2": {
      "outer3": {
        "key1": "value1",
        "key2": "value2"
      }
    },
    "outer4": {
      "key1": "value1",
      "key2": "value2"
    }
  }
}

我希望输出为

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

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

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

推荐答案

假设您的输入如下所示:

{
  "outer1": {
    "outer2": {
      "outer3": {
        "key1": "value1",
        "key2": "value2"
      },
      "outer4": {
        "key1": "value1",
        "key2": "value2"
      }
    }
  }
}

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

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

接下来,根据您的需要格式化此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)"
    ), ""
'
[outer1.outer2.outer3]
key1 = value1
key2 = value2

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

Json相关问答推荐

使用jolt删除空对象

Vega通孔信号中的动态梯度

无法从MongoDB集合中检索正确的文档

创建Json嵌套文件 struct

当由.sh脚本执行时,AWS查询字符串不会提取任何数据

基于 JSON 字段的 Jolt 条件标志

(已回答)JSON 读取函数返回未定义而不是预期值 - Typescript

基于JQ中另一个对象的值 Select 对象

使用 jq 工具将文本从 txt 文件转换为 json

用于遮蔽卡的 Jolt 规格

如何从字符串中创建一个逗号分隔的列表,由 API 中的 JSON 对象内的编号空格分隔?

JOLT JSON 将值从一对多转换为一对一

如何在 jQuery 中循环遍历 JSON 数组?

在 Bash 中访问 JSON 对象 - 关联数组/列表/另一个模型

如何在 MVC4 中将 Json 字符串输出为 JsonResult?

JSON.stringify 不会转义?

我们可以使用 JSON 作为数据库吗?

Jsonpath 与 Jackson 或 Gson

Sequelize - 如何仅返回数据库结果的 JSON 对象?

jq:按属性分组和键