从 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
列。
我正在使用 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
列。