Nifi 操纵来自 Invokehttp 的所有 Json 键值

Nifi manipulate all Json Key Values from Invokehttp

我有一个来自 InvokeHTTP 的 json。我做了一个 Split Json 和 JoltTransform 来获取键、值,但我需要将所有键从 Camelcase 更改为 snakecase。

每次调用 InvokeHttp 时,我的密钥都会不同。我尝试了 AttributestoJson 和 EvaluateJsonPath 以及一些替换文本,但还没有想出一种方法来动态更改键然后合并回值而无需编写自定义处理器。

来自 InvokeHTTP 的原始数据:

{
  "data": {
    "Table": [
      {
        "Age": 51,
        "FirstName": "Bob",
        "LastName": "Doe"
      },
      {
        "Age": 26,
        "FirstName": "Ryan",
        "LastName": "Doe"
      }
    ]
  }
}

Split Json 后的输入(在单独的流文件中给我每个 json)和 Jolt:

[
  {
    "Key": "Age",
    "Value": 51
  },
  {
    "Key": "FirstName",
    "Value": "Bob"
  },
  {
    "Key": "LastName",
    "Value": "Doe"
  }
]

期望的输出:

{
  "data": {
    "Table": [
      {
        "age": 51,
        "first_name": "Bob",
        "last_name": "Doe"
      },
      {
        "age": 26,
        "first_name": "Ryan",
        "last_name": "Doe"
      }
    ]
  }
}

我写了 ,它使用 ReplaceText 将 JSON 键中的 . 替换为 _。此处可以应用相同的逻辑(link 中提供模板)。正如我在那个答案中指出的那样,更简洁的解决方案是使用 ExecuteScript,尤其是在大多数脚本语言中很容易完成从驼峰式到蛇形的转换。

如果你知道这些字段,你可以在原始输入上使用 JoltTransformJSON JSON 这样你就不必使用 SplitJson,这里有一个规范将执行(显式)字段名称转换:

[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "Table": {
          "*": {
            "Age": "data.Table[#2].age",
            "FirstName": "data.Table[#2].first_name",
            "LastName": "data.Table[#2].last_name"
          }
        }
      }
    }
  }
]

您也可以使用 UpdateRecord,您只需要 JsonTreeReader 和 JsonRecordSetWriter 的单独架构。