从 JSON (Apache Ni-Fi) 中提取和修改文本

Extract and modify text from JSON (Apache Ni-Fi)

我正在使用 InvokeHttp 获取 json 作为来自 REST API 的响应。 我的 json 看起来像:

{
    "resourceNames": [
        "customers/123",
        "customers/12345",
        "customers/555",
        "customers/9890"
    ]
}

如何从这个 json 中提取 4 个没有客户前缀的字符串?

123
12345
555
9890

最快的方法是使用 ExecuteScript 和一个小的 Groovy 脚本,该脚本将使用 Groovy 的 JsonSlurper 解析 JSON,提取值,然后重写流文件的内容。

我想如果你想使用纯 NiFi 处理器,你会使用 ReplaceText 来清理 "customers/"

给你这个:

{
    "resourceNames": [
        "123",
        "12345",
        "555",
        "9890"
    ]
}

并且您可以使用 EvaluateJson 将其解析为 valX = $.resourceNames.[*]

但是如果您想将其提升为数据库插入,您可以对传入流进行拆分,而不是将其放入属性中。

您可以使用 splitjson insdted of EvaluateJson - 在 $.resourceNames 上拆分,然后使用添加属性的 ExtractText 让我们说 datapoint = (?s)(^.*$) 值然后被发送到 PutSQL,在那里你 SQL Statement 看起来像 insert into mytbl values (${datapoint}).

同样 - 您可以使用 PutRecord proc 进行更高效的设置,但这将需要设置其他内容并且有点复杂,如果您有大量流程可能 PutRecord是路线,Split, Evaluate, extract 处理器最终变得非常慢并且它们消耗大量内存。

相当重 - 由于 ReplaceText 的性质,而且如果您的字符串发生变化,您可以将其作为参数传递。

一个好的方法是 JoltTransformJSON 处理器,要获得正确的 Jolt 规范 是相当棘手的,但它会比替换文本。

您可以使用 Groovy 执行此操作,如果您已经拥有原始 JSON,则可以执行以下操作:

def output = input['resourceNames'].collect{ name ->
  name - 'customers/'
}
println JsonOutput.toJson(output)

这将产生以下输出:

["123","12345","555","9890"]

下面是我为此创建的完整示例代码:

import groovy.json.JsonSlurper
import groovy.json.JsonOutput

String json = '''{
    "resourceNames": [
        "customers/123",
        "customers/12345",
        "customers/555",
        "customers/9890"
    ]
}'''

Map input = new JsonSlurper().parseText(json)

def output = input['resourceNames'].collect{ name ->
  name - 'customers/'
}

println JsonOutput.toJson(output)

您可以使用 JoltTransformJSON -> PutDatabaseRecord 使用以下 JOLT 规范:

[
  {
    "operation": "shift",
    "spec": {
      "resourceNames": {
        "*": {
          "customers/*": {
            "$(0,1)": "[].id"
          }
        }
      }
    }
  }
]

这将创建以下输出:

[ {
  "id" : "123"
}, {
  "id" : "12345"
}, {
  "id" : "555"
}, {
  "id" : "9890"
} ]

然后您可以将其发送到 PutDatabaseRecord,它会为流程文件中的每个 JSON 对象插入一行(假设您在 PutDatabaseRecord 中使用 JsonTreeReader),并将给定值插入 id列。