Jq: How to move the child members to parent?

2019-07-17 08:56发布

Consider the following json:

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

How can I move all the properties of b to be under the parent a:

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

3条回答
成全新的幸福
2楼-- · 2019-07-17 09:34

For this particular case, you could do this:

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

Here we're updating object a with the original contents with b replaced with an empty object and combining it with the contents of the original b.

If that was too hard to reason about, this might be easier to follow:

$ jq '.a |=
    with_entries(if .key == "b"
        then (.value = {}), (.value | to_entries[])
        else .
    end)' input.json
查看更多
走好不送
3楼-- · 2019-07-17 09:38

This is just a variant of @Jeff-Mercado's first solution, but may be slightly easier to follow (notably because there is only one reference to .b, and because the grouping on the RHS is explicit):

 .a |= ({b:{}} + .b)
查看更多
▲ chillily
4楼-- · 2019-07-17 09:51

To do this recursively for any field use:

walk
(
    if (type == "object" and has("b")) then
        .|=.b
    else
        .
    end
)
查看更多
登录 后发表回答