使用jq保留键名来展平JSON

时间:2017-02-22 19:58:17

标签: json key jq flatten

我正在尝试压缩由嵌套对象组成的JSON。顶层包含多个键/值对,其中每个值本身是一个包含多个对象(底层)的数组。

我想使用jq获取的只是一个包含底层所有对象的对象数组,每个对象都有一个额外的键/值对,用于标识它最初属于的顶层键。 / p>

换句话说,我想转一个JSON

{
 "key1": [obj1, obj2],
 "key2": [obj3]
}

进入普通数组

[OBJ1, OBJ2, OBJ3]

其中每个OBJi只是具有额外键/值对的原始对象

"parent-key-name": keyx

其中keyx属于顶层密钥obji,即"key1"obj1 obj2以及"key2" obj3

我正在努力解决这个问题,即当引用底层的对象时,例如通过。[],jq似乎没有内置功能来访问相关的顶层信息。但是,我是jq的新手,希望毕竟有一个简单的解决方案。

2 个答案:

答案 0 :(得分:2)

给出以下输入:

{
 "key1": [{"name":"Emma"},{"name":"Bob"}],
 "key2": [{"name":"Jean"}]
}

您可以将项目划分为条目,将密钥存储在变量中,并为value对象中的每个项目添加值:

jq  '[ to_entries[] | .key as $parent | .value[] |
   .["parent-key-name"] |= (.+ $parent) ] ' test.json

给出以下输出:

[
  {
    "name": "Emma",
    "parent-key-name": "key1"
  },
  {
    "name": "Bob",
    "parent-key-name": "key1"
  },
  {
    "name": "Jean",
    "parent-key-name": "key2"
  }
]

答案 1 :(得分:1)

下面介绍的解决方案包含两个步骤,每个步骤可能分别有用,例如:如果有人想要"压扁" JSON的方式略有不同。

  1. 首先,让我们对obj [i]"就地"进行更改:

    with_entries(.key as $ k | .value [] | =(。+ {" parent-key-name":$ k}))

  2. 示例:

    $ jq -n -c -f program.jq
    

    输入:     {      " key1":[{a:1},{a:2}],      " key2":[{b:3}]     }

    输出:

    {
      "key1": [
        {
          "a": 1,
          "parent-key-name": "key1"
        },
        {
          "a": 2,
          "parent-key-name": "key1"
        }
      ],
      "key2": [
        {
          "b": 3,
          "parent-key-name": "key2"
        }
      ]
    }
    
    1. 要展平,只需将| [.[]]附加到上面的过滤器即可。这会产生:

      [[{"":1,"父密钥名称":" KEY1"},{"&#34 ;: 2,"父密钥名称":" KEY1"}],[{" b":3,"父密钥名称&#34 ;:" KEY2"}]]