在Nifi使用Groovy脚本获取空数组



我有一个需求,我需要将数据解析成所需的格式

输入:

{
"Message" : "nRecord 1:nRequired data is missing. nnRecord 2:nprocessing failedn"
}

这里的内容和分隔符不是固定的。固定部分仅是/nRecord关键字,我正在编写脚本。但是我没有使用Groovy得到想要的输出。

所需输出:

[
{
"Record 1": "nRequired data is missing"
},
{
"Record 2": "processing failed"
}
]

我已经写了相同的Groovy脚本,但我得到空数组。

import org.apache.commons.io.IOUtils
import groovy.json.*
import java.util.ArrayList
import java.nio.charset.*
import java.nio.charset.StandardCharsets
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder

def flowFile = session.get()
if(!flowFile) return
try {
flowFile = session.write(flowFile,
{ inputStream, outputStream ->
def text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
splitted = text.split('nRecord')
int j = splitted.size()
final1 = []
for (int i=0;i<j-1;i++)
{
k = "Record " + splitted[i+1]
valid = k.replaceAll("\n|"|\n|}","")
final1.add("{"" + valid.replaceFirst(":",'":"')+ ""}" )
}
def json = JsonOutput.toJson(final1)
outputStream.write(JsonOutput.prettyPrint(json).getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)
} catch(Exception e) {
log.error('Error during JSON operations', e)
flowFile = session.putAttribute(flowFile, "error", e.getMessage())
session.transfer(flowFile, REL_FAILURE)
}

你能帮我一下吗?

谢谢。

我会用一个简单的技巧来使用正则表达式:

import groovy.json.*
def json = new JsonSlurper().parseText '{ "Message" : "nRecord 1:nRequired data is missing. nnRecord 2:nprocessing failednRecord 3:nprocessing failed badlyn" }'
String msg = json.Message.replaceAll( /n+(Record d+:)/, '=$1' ) // THE trick!
List res = ( msg =~ /(?m)(Record d+):([^=]+)*/ ).collect{ _, rec, text -> [ (rec):text.trim() ] }
assert JsonOutput.toJson( res ) == '[{"Record 1":"Required data is missing."},{"Record 2":"processing failed"},{"Record 3":"processing failed badly"}]'

最新更新