将Json转换为CSV的Nifi Groovy脚本
我输入了以下格式的json HTTP响应。我只想从Json中提取几个字段,并将它们转换成CSV格式。我想编写Groovy脚本来读取json并将其写入csv格式 输入json文件:将Json转换为CSV的Nifi Groovy脚本,groovy,apache-nifi,Groovy,Apache Nifi,我输入了以下格式的json HTTP响应。我只想从Json中提取几个字段,并将它们转换成CSV格式。我想编写Groovy脚本来读取json并将其写入csv格式 输入json文件: { "Links": {}, "Items": [ { "Timestamp": "2019-11-20T01:51:11.8660125Z", "Value": 36.77309, "UnitsAbbreviation": "", "Good": tru
{
"Links": {},
"Items": [
{
"Timestamp": "2019-11-20T01:51:11.8660125Z",
"Value": 36.77309,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
},
{
"Timestamp": "2019-11-20T02:17:19.7750091Z",
"Value": 36.8910828,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
}
],
"UnitsAbbreviation": "AHK"
}
预期输出csv格式:
Timestamp,Value
"2019-11-20T01:51:11.8660125Z",36.77309
"2019-11-20T02:17:19.7750091Z",36.8910828
由于我是Groovy新手,有人能帮我编写Groovy代码示例吗?我不想用拆分json、评估json和写入csv这样的多个过程使流程复杂化
任何帮助或指点都是值得的。谢谢。使用
ExecuteScript
来避免使用其他处理器,这与NiFi的要点大相径庭
您也不必使用SplitJSON
或EvaluateJSONPath
相反,您可以使用Jolt转换DSL
设置为Shift
和Jolt规范
设置为:
{
"Items": {
"*": {
"Timestamp": "[#2].&",
"Value": "[#2].&"
}
}
}
这会将JSON转换为JSON格式的所需模式。然后,将记录读取器
设置为控制器服务,并将记录写入器
设置为控制器服务
因此,我们这里只有->jolttransferormjson
->ConvertRecord
->
这将使用保证工作的两个处理器将您的输入转换为您想要的结果
使用
ExecuteScript
会带来未知行为和错误的风险。使用ExecuteScript
来避免使用其他处理器几乎没有NiFi的意义
您也不必使用SplitJSON
或EvaluateJSONPath
相反,您可以使用Jolt转换DSL
设置为Shift
和Jolt规范
设置为:
{
"Items": {
"*": {
"Timestamp": "[#2].&",
"Value": "[#2].&"
}
}
}
这会将JSON转换为JSON格式的所需模式。然后,将记录读取器
设置为控制器服务,并将记录写入器
设置为控制器服务
因此,我们这里只有->jolttransferormjson
->ConvertRecord
->
这将使用保证工作的两个处理器将您的输入转换为您想要的结果
使用
ExecuteScript
可能会导致未知的行为和错误。不确定它是否与nifi有关,但在纯groovy中,您的代码可能如下所示:
String inp = '''{
"Links": {},
"Items": [
{
"Timestamp": "2019-11-20T01:51:11.8660125Z",
"Value": 36.77309,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
},
{
"Timestamp": "2019-11-20T02:17:19.7750091Z",
"Value": 36.8910828,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
}
],
"UnitsAbbreviation": "AHK"
}'''
Map json = new groovy.json.JsonSlurper().parseText inp
String csv = json.Items.inject( 'Timestamp,Value' ){ res, item -> res + """\n"$item.Timestamp",$item.Value""" }
assert csv == '''Timestamp,Value
"2019-11-20T01:51:11.8660125Z",36.77309
"2019-11-20T02:17:19.7750091Z",36.8910828'''
不确定它是否与nifi有关,但在纯groovy中,您的代码可能如下所示:
String inp = '''{
"Links": {},
"Items": [
{
"Timestamp": "2019-11-20T01:51:11.8660125Z",
"Value": 36.77309,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
},
{
"Timestamp": "2019-11-20T02:17:19.7750091Z",
"Value": 36.8910828,
"UnitsAbbreviation": "",
"Good": true,
"Questionable": false,
"Substituted": false
}
],
"UnitsAbbreviation": "AHK"
}'''
Map json = new groovy.json.JsonSlurper().parseText inp
String csv = json.Items.inject( 'Timestamp,Value' ){ res, item -> res + """\n"$item.Timestamp",$item.Value""" }
assert csv == '''Timestamp,Value
"2019-11-20T01:51:11.8660125Z",36.77309
"2019-11-20T02:17:19.7750091Z",36.8910828'''
谢谢你,本。我还没想过乔特。我将尝试这种方法。谢谢Ben。我还没想过乔特。我将尝试这种方法。