Jolt:保留所有顶级字段,并将特定的子字段放在顶部

  • 本文关键字:字段 顶部 保留 Jolt json jolt
  • 更新时间 :
  • 英文 :


我想写一个Jolt转换来转换这种JSON:

{
"promoted_by": "client1",
"parent": "parent1",
"cmdb_ci": {
"display_value": "cmdb_value",
"link": "https://blabla"
}
}

Into this:

{
"promoted_by": "client1",
"parent": "parent1",
"cmdb_ci": "cmdb_value"
}

真正的JSON包含更多的字段。换句话说,我想保留所有顶级字段,当一个字段包含"display_value"子字段,它应该接受它并将其放在顶层,并丢弃其他子字段,如"link"

我现在的代码是这样的:

[
{
"operation": "shift",
"spec": {
"*": {
"display_value": "&1"
},
"*": "&"
}
}
]

display_value"; "&1"part的工作是将所有display_value子字段放到顶层,但我不知道如何保留所有其他字段,而不重新定位所有带有"*"的内容。

谢谢!

您可以使用下面的shift转换规范

[
{
"operation": "shift",
"spec": {
"*": "&",
"cmdb_ci": { // else case
"display_value": {
"@": "&2" // @ : copies the value of "display_value" from one level up, &2 : copies the literal "cmdb_ci" by going two levels up the tree
}
}
}
}
]

分别从顶层复制键为cmdb_ci

的对象的key和value或直接将标识符的值与上一级键(如

)匹配。
[
{
"operation": "shift",
"spec": {
"*": "&",
"cmdb_ci": {
"@display_value": "&"
}
}
}
]

编辑:您可以将规范转换为下面的规范,考虑到您需要考虑到所有具有display_value子字段的字段,而不是特定的cmdb_ci,因为它们是多个具有display_value和链接子字段的类似字段

[
{
"operation": "shift",
"spec": {
"*": {
"@display_value": "&",
"@": "&"
}
}
},
{
"operation": "cardinality",
"spec": {
"*": "ONE"
}
}
]

,仅从改组后的数组中为顶级对象(在本例中为cmdb_ci)的值选择第一个匹配的组件