Nifi从Invokehttp操纵所有Json键值

时间:2018-09-18 14:30:20

标签: json apache-nifi jolt

我有一个来自InvokeHTTP的json。我做了一个Split Json和JoltTransform来获取Key,Values,但是我需要将所有Key从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"
      }
    ]
  }
}

2 个答案:

答案 0 :(得分:1)

我写了https://www.pro-football-reference.com/years/2005/,它使用ReplaceText.替换了JSON密钥中的_。此处可以应用相同的逻辑(链接中提供模板)。正如我在该答案中指出的那样,一种更干净的解决方案是使用ExecuteScript,尤其是在大多数脚本语言中,从驼峰到蛇形的转换很容易完成。

答案 1 :(得分:1)

如果您知道这些字段,则可以在原始输入JSON上使用JoltTransformJSON,因此不必使用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使用单独的架构即可。