首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用jq合并2个文件中的2个JSON对象?

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

Stack Overflow用户
提问于 2013-10-23 06:43:47
回答 6查看 127.7K关注 0票数 169

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

我有两个文件,想把它们合并成一个唯一的文件json

这里是文件的内容:

file1

代码语言:javascript
复制
{
    "value1": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value1": "v1",
            "value2": "v2"
        },
        "bbb": {
            "value1": "v1",
            "value2": "v2"
        },
        "ccc": {
            "value1": "v1",
            "value2": "v2"
        }
    }
}

file2

代码语言:javascript
复制
{
    "status": 200,
    "timestamp": 1382461861,
    "value": {
        "aaa": {
            "value3": "v3",
            "value4": 4
        },
        "bbb": {
            "value3": "v3"
        },      
        "ddd": {
            "value3": "v3",
            "value4": 4
        }
    }
}

预期结果

代码语言:javascript
复制
{
    "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
        }
    }
}

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

代码语言:javascript
复制
{
  "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"
  }
}

使用以下命令:

代码语言:javascript
复制
jq -s '.[].value' file1 file2
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-07-23 15:27:14

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

代码语言:javascript
复制
jq -s '.[0] * .[1]' file1 file2

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

会给你带来:

代码语言:javascript
复制
{
  "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
}

如果您还想摆脱其他键(就像您预期的结果),一种方法是:

代码语言:javascript
复制
jq -s '.[0] * .[1] | {value: .value}' file1 file2

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

代码语言:javascript
复制
jq -s '.[0].value * .[1].value | {value: .}' file1 file2
票数 219
EN

Stack Overflow用户

发布于 2014-06-19 14:29:45

使用jq -s add

代码语言:javascript
复制
$ echo '{"a":"foo","b":"bar"} {"c":"baz","a":0}' | jq -s add
{
  "a": 0,
  "b": "bar",
  "c": "baz"
}

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

(add被定义为def add: reduce .[] as $x (null; . + $x);,它遍历输入数组的/对象的值并将它们相加。Object addition == merge。)

票数 87
EN

Stack Overflow用户

发布于 2014-03-02 06:21:47

谁知道你是否仍然需要它,但这里是解决方案。

一旦使用了--slurp选项,就很容易了!

代码语言:javascript
复制
--slurp/-s:
    Instead of running the filter for each JSON object in the input,
    read the entire input stream into a large array and run the filter just once.

然后,+操作符将执行您想要的操作:

代码语言:javascript
复制
jq -s '.[0] + .[1]' config.json config-user.json

(注意:如果你想合并内部对象,而不是仅仅用右文件对象覆盖左文件对象,则需要手动完成)

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19529688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档