Jq:如何将孩子成员移到父母身边?

时间:2017-02-13 22:51:08

标签: json parent-child jq

考虑以下json:

{
  a: {
    b: {
      c: 1,
      d: 2
    }
  }
}

如何将b的所有属性移动到父级a:

之下
{
  a: {
    c: 1,
    d: 2,
    b: {}
  }
}

3 个答案:

答案 0 :(得分:2)

对于这种特殊情况,你可以这样做:

$ jq '.a |= (.b = {}) + .b' input.json

此处,我们正在使用原始内容更新对象a,其中b替换为空对象,并将其与原始b的内容相结合。

如果这太难以理解,这可能更容易理解:

$ jq '.a |=
    with_entries(if .key == "b"
        then (.value = {}), (.value | to_entries[])
        else .
    end)' input.json

答案 1 :(得分:1)

这只是@ Jeff-Mercado的第一个解决方案的变体,但可能稍微容易理解(特别是因为只有一个对.b的引用,并且因为RHS上的分组是明确的):

 .a |= ({b:{}} + .b)

答案 2 :(得分:0)

为任何字段使用递归执行此操作:

walk
(
    if (type == "object" and has("b")) then
        .|=.b
    else
        .
    end
)