【问题标题】:Jq: How to move the child members to parent?Jq:如何将子成员移动到父级?
【发布时间】:2017-02-13 22:51:07
【问题描述】:

考虑以下 json:

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

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

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

【问题讨论】:

  • < in jq '. + { "a": (.a + .a.b) }' 是我能做的最好的,但扩展性不是很好。

标签: json parent-child jq


【解决方案1】:

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

$ 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 感谢您将我推向正确的方向。更通用的解决方案是使用 walk,我已将其作为单独的答案发布。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多