当前位置: 首页 > 知识库问答 >
问题:

如何使用jq从2个文件中合并2个JSON对象?

谷梁涵忍
2023-03-14

我在shell脚本中使用jq工具(jqjson处理器)来解析json。

我有2个json文件,希望将它们合并到一个唯一的文件中

文件内容如下:

文件1

{
    "value1": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value1": "v1",
            "value2": "v2"
        },
        "bbb": {
            "value1": "v1",
            "value2": "v2"
        },
        "ccc": {
            "value1": "v1",
            "value2": "v2"
        }
    }
}

文件2

{
    "status": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value3": "v3",
            "value4": 4
        },
        "bbb": {
            "value3": "v3"
        },      
        "ddd": {
            "value3": "v3",
            "value4": 4
        }
    }
}

预期结果

{
    "value": {
        "aaa": {
            "value1": "v1",
            "value2": "v2",
            "value3": "v3",
            "value4": 4
        },
        "bbb": {
            "value1": "v1",
            "value2": "v2",
            "value3": "v3"
        },
        "ccc": {
            "value1": "v1",
            "value2": "v2"
        },
        "ddd": {
            "value3": "v3",
            "value4": 4
        }
    }
}

我尝试了很多组合,但我得到的唯一结果是以下结果,这不是预期的结果:

{
  "ccc": {
    "value2": "v2",
    "value1": "v1"
  },
  "bbb": {
    "value2": "v2",
    "value1": "v1"
  },
  "aaa": {
    "value2": "v2",
    "value1": "v1"
  }
}
{
  "ddd": {
    "value4": 4,
    "value3": "v3"
  },
  "bbb": {
    "value3": "v3"
  },
  "aaa": {
    "value4": 4,
    "value3": "v3"
  }
}

使用此命令:

jq -s '.[].value' file1 file2

共有3个答案

张丰
2023-03-14

这是一个在任意数量的对象上递归工作的版本(使用*):

echo '{"A": {"a": 1}}' '{"A": {"b": 2}}' '{"B": 3}' |\
  jq --slurp 'reduce .[] as $item ({}; . * $item)'

{
  "A": {
    "a": 1,
    "b": 2
  },
  "B": 3
}
公孙黎昕
2023-03-14

使用jq-s add:

$ echo '{"a":"foo","b":"bar"} {"c":"baz","a":0}' | jq -s add
{
  "a": 0,
  "b": "bar",
  "c": "baz"
}

这将所有JSON文本从标准输入读取到一个数组中(jq-s这样做),然后它“减少”它们。

add定义为def add: duce.[]为$x(null;.$x);,它遍历输入数组的/对象的值并将它们相加。对象添加==合并。)

卢文博
2023-03-14

从1.4开始,现在可以使用操作员执行此操作。当给定两个对象时,它将递归地合并它们。例如

jq -s '.[0] * .[1]' file1 file2

重要提示:请注意将文件放在同一数组中的-s(-slurp)标志。

将为您带来:

{
  "value1": 200,
  "timestamp": 1382461861,
  "value": {
    "aaa": {
      "value1": "v1",
      "value2": "v2",
      "value3": "v3",
      "value4": 4
    },
    "bbb": {
      "value1": "v1",
      "value2": "v2",
      "value3": "v3"
    },
    "ccc": {
      "value1": "v1",
      "value2": "v2"
    },
    "ddd": {
      "value3": "v3",
      "value4": 4
    }
  },
  "status": 200
}

如果还想删除其他键(如预期结果),一种方法是:

jq -s '.[0] * .[1] | {value: .value}' file1 file2

或者可能更高效(因为它不合并任何其他值):

jq -s '.[0].value * .[1].value | {value: .}' file1 file2
 类似资料:
  • 问题内容: 我在外壳程序脚本中使用jq工具(jq-json-processor)来解析json。 我有2个json文件, 想将它们合并为一个唯一的文件 这里是文件的内容: 文件1 文件2 预期结果 我尝试了很多组合,但是我得到的唯一结果是以下结果,这不是预期的结果: 使用此命令: 问题答案: 从1.4开始,操作员现在可以做到这一点。当给定两个对象时,它将递归合并它们。例如, 重要:请注意该标志,它

  • 问题内容: 让我们看一个例子。 我需要合并这两个对象数组并创建以下数组: 有没有JavaScript或jQuery函数可以做到这一点? 不适合我 它返回 问题答案: 如果要在JavaScript中合并2个对象数组。你可以使用这一招 例如 输出:

  • 问题内容: 我有一个程序需要合并两个。哈希图的键为a ,值为。合并的特殊条件是,如果键已在字典中,则需要将其添加到现有值中而不是替换它。这是我到目前为止抛出的代码。 问题答案: 如果您的代码不能保证会在到达此方法之前将其初始化,则您将必须执行null检查,没有出路 考虑到HashMap允许将null作为值在代码中容易发生NPE的另一个位置是 如果这两个都不为空,则将获得NPE。

  • 我想将至少2个PDF文件合并为一个,同时保留原始PDF中的所有表单元素。表单元素包括文本字段、单选按钮、复选框、下拉菜单等。请查看此示例PDF文件的表单: 你能做到吗? 编辑:至于实现,我更希望在linux平台上使用开源工具(如'ghostscript'或任何其他您认为适合解决此任务的工具)的命令行解决方案。 当然,欢迎每个人提供解决这个问题的任何工作解决方案,包括一个编码解决方案,它涉及编写一个

  • active=testing my.test.value=test 当前它失败了,错误:原因:java.lang.IllegalArgumentException:无法解析值“${my.test.value}”中的占位符“my.test.value”

  • 我试图结合2个不同的Excel文件。(多亏了post导入多个excel文件到python pandas中,并将它们连接到一个dataframe中) 到目前为止,我得出的结论是: 下面是他们的样子。 null