如何将JSON对象与子数组合并,在数组中添加具有匹配值的对象,而不是用jq替换它们?

时间:2018-01-19 20:05:37

标签: arrays json merge jq

我有两个JSON对象:

{
  "parameter1": "object1",
  "childs": [
    { 
      "id": "child1",
      "parameter-A": "value-A"
    }
  ]
}

{
  "parameter2": "object2",
  "childs": [
    { 
      "id": "child1",
      "parameter-B": "value-B"
    }
  ]
}

我需要合并对象,但我不想让包含的数组被替换,但也要合并,即在id等于的情况下添加。这就是我需要的:

{
  "parameter1": "object1",
  "parameter2": "object2",
  "childs": [
    { 
      "id": "child1",
      "parameter-A": "value-A",
      "parameter-B": "value-B"
    }
  ]
}

我目前将这两个文件与jq -s '.[0] * .[1]' file1 file2合并,但参数-A被参数-B覆盖,其中包含缺少参数-A的不需要的结果:

{
  "parameter1": "object1",
  "parameter2": "object2",
  "childs": [
    { 
      "id": "child1",
      "parameter-B": "value-B"
    }
  ]
}

如果可以简化解决方案,我也可以更改JSON结构。

1 个答案:

答案 0 :(得分:0)

我认为,以下过滤器将在已呈现的特定情况下产生预期结果,但一般要求不清楚,因此可能需要相应地进行调整:

def add_merge($one; $two):
  def pairwise_add:
    transpose
    | map(if .[0].id == .[1].id then add else . end);
  reduce ($one|keys_unsorted[]) as $k ($one+$two;
     if ($one[$k]|type) == "array"
     then .[$k] = ([$one[$k], $two[$k]] | pairwise_add)
     else .
     end);

对于给定的一对对象,结果是:

{
  "parameter1": "object1",
  "childs": [
    {
      "id": "child1",
      "parameter-A": "value-A",
      "parameter-B": "value-B"
    }
  ],
  "parameter2": "object2"
}