将Json转换为CSV的Nifi Groovy脚本

将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

我输入了以下格式的json HTTP响应。我只想从Json中提取几个字段,并将它们转换成CSV格式。我想编写Groovy脚本来读取json并将其写入csv格式

输入json文件:

{
  "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。我还没想过乔特。我将尝试这种方法。