我想写一个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
)的值选择第一个匹配的组件