收集具有相同属性值的JSON对象,并创建新的键/值对

时间:2018-11-14 21:28:00

标签: json transformation jq

这是我正在使用的JSON数据的简化示例:

[
  { "certname": "one.example.com",
    "name": "fact1",
    "value": "value1"
  },
  { "certname": "one.example.com",
    "name": "fact2",
    "value": 42
  },
  { "certname": "two.example.com",
    "name": "fact1",
    "value": "value3"
  },
  { "certname": "two.example.com",
    "name": "fact2",
    "value": 10000
  },
  { "certname": "two.example.com",
    "name": "fact3",
    "value": { "anotherkey": "anothervalue" }
  }
]

我希望通过使用jq获得的结果如下:

[
  {
    "certname": "one.example.com",
    "fact1": "value1",
    "fact2": 42
  },
  {
    "certname": "two.example.com",
    "fact1": "value3",
    "fact2": 10000,
    "fact3": { "anotherkey": "anothervalue" }
  }
]

值得指出的是,并非所有元素都具有相同的名称/值对。此外,值本身就是复杂的对象。

如果我使用Python进行此操作,那没什么大不了的(是的,现在我能听到“用Python进行操作”的合唱声在我耳边响起)。我想了解如何在jq中执行此操作,此刻我正在逃避。

1 个答案:

答案 0 :(得分:1)

  

...最好使用jq ...

那是精神!本着这种精神,这是一个简洁的解决方案:

map( {certname, (.name): .value} )
| group_by(.certname)
| map(add)

当然,还有其他合理的解决方案。如果上面的内容让人一头雾水,则可能想在此处或此处添加debug语句,或者可能想通过自己执行第一行来探索管道,等等。