Nifi:更改数组中所有元素的相同值(例如 test="nio" => test=0)
Nifi: Change the same values of all elements in an array (e.g. test="nio" => test=0)
Edit1:可以添加任意数量的同名新属性,其值也将被更改。因此,可能会出现多个具有相同名称和相同值的属性,这些属性必须全部交换。因此它应该是动态的。
我在以下时间无法继续使用 Nifi。我想在相同的基础上更改数组中某些属性的值。例如,在我的例子中,需要进行以下更改:
test="nio" => test=0
test="io" => test=1
我的第一个猜测是用 JOLT 来实现它,但我目前在这方面缺乏任何方法。
输入:
{
"counterTop": {
"loaf1": [
{
"type": "white",
"unit": "mm",
"test": "nio"
},
{
"type": "black",
"unit": "cm",
"test": "io"
},
{
"type": "black123",
"unit": "mm",
"test": "io"
}
]
}
}
预期输出:
{
"counterTop": {
"loaf1": [
{
"type": "white",
"unit": "mm",
"test": "0"
},
{
"type": "black",
"unit": "cm",
"test": "1"
},
{
"type": "black123",
"unit": "mm",
"test": "1"
}
]
}
}
这里有人有解决办法吗?
提前致谢!
可以先通过"*"
个通配符漫游分到最里面,然后在counterTop.loaf1[&..]
内组合攻克,比如
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": {
"*": "counterTop.loaf1[&1].&",
"test": {
"nio": {
"@(2,&1)": { "*": { "#0": "counterTop.loaf1[&].&4" } }
},
"io": {
"@(2,&1)": { "*": { "#1": "counterTop.loaf1[&].&4" } }
}
}
}
}
}
}
}
]
其中最右边的 .&4
表示向上 4 级以到达键 test
,最右边的 .&
表示其余键的值。
编辑:考虑到你最后一个有多个元素的案例,你可以更喜欢使用以下而不是上面的作为通用案例
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": {
"*": "loaf1[&1].&",
"test": {
"nio": {
"@(2,&1)": { "*": { "#0": "&4" } }
},
"io": {
"@(2,&1)": { "*": { "#1": "&4" } }
}
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"test": {
"*": "counterTop.loaf1[&].&1",
"@(1,loaf1)": "counterTop.loaf1"
}
}
}
]
以下是如何使用 ReplaceText 处理器实现此目的的示例:
注意替换文本配置:
这种方法的缺点是每个映射都需要单独的处理器。为了克服它,你可以使用 ReplaceTextWithMapping,这里有一个很棒的 explanation
Edit1:可以添加任意数量的同名新属性,其值也将被更改。因此,可能会出现多个具有相同名称和相同值的属性,这些属性必须全部交换。因此它应该是动态的。
我在以下时间无法继续使用 Nifi。我想在相同的基础上更改数组中某些属性的值。例如,在我的例子中,需要进行以下更改:
test="nio" => test=0
test="io" => test=1
我的第一个猜测是用 JOLT 来实现它,但我目前在这方面缺乏任何方法。
输入:
{
"counterTop": {
"loaf1": [
{
"type": "white",
"unit": "mm",
"test": "nio"
},
{
"type": "black",
"unit": "cm",
"test": "io"
},
{
"type": "black123",
"unit": "mm",
"test": "io"
}
]
}
}
预期输出:
{
"counterTop": {
"loaf1": [
{
"type": "white",
"unit": "mm",
"test": "0"
},
{
"type": "black",
"unit": "cm",
"test": "1"
},
{
"type": "black123",
"unit": "mm",
"test": "1"
}
]
}
}
这里有人有解决办法吗? 提前致谢!
可以先通过"*"
个通配符漫游分到最里面,然后在counterTop.loaf1[&..]
内组合攻克,比如
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": {
"*": "counterTop.loaf1[&1].&",
"test": {
"nio": {
"@(2,&1)": { "*": { "#0": "counterTop.loaf1[&].&4" } }
},
"io": {
"@(2,&1)": { "*": { "#1": "counterTop.loaf1[&].&4" } }
}
}
}
}
}
}
}
]
其中最右边的 .&4
表示向上 4 级以到达键 test
,最右边的 .&
表示其余键的值。
编辑:考虑到你最后一个有多个元素的案例,你可以更喜欢使用以下而不是上面的作为通用案例
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": {
"*": "loaf1[&1].&",
"test": {
"nio": {
"@(2,&1)": { "*": { "#0": "&4" } }
},
"io": {
"@(2,&1)": { "*": { "#1": "&4" } }
}
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"test": {
"*": "counterTop.loaf1[&].&1",
"@(1,loaf1)": "counterTop.loaf1"
}
}
}
]
以下是如何使用 ReplaceText 处理器实现此目的的示例: