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