是否可以使用 NIFI 中的 Jolt 规范从单个 JSON 创建多个 JSON 对象

问题描述

我有一个输入 JSON:

{
  "flu": "flu1","reportId": 11,"Name":"Transform"
}
 

预期输出

{
  "flu": "flu1","Name":"Transform","fullname":"flu1-11-Transform"
}
{
 "type":"relationship","id":"flu1-11-Transform"
}

规格:

[{
  "operation":"modify-default-beta","spec":{
    "fullname": "=concat(@(1,flu),'-',@(1,reportId),Name))"
  }
}]

上述规范适用于第一个 JSON 对象。是否可以创建两个 JSON 对象,如预期输出中所示?

解决方法

您只能使用 JOLT 输出一个顶级对象,但该对象可以是一个数组(您所需的输出不是有效的 JSON 原样)。如果你想要一个包含这些对象的二元素数组,你可以使用以下规范:

[{
    "operation": "modify-default-beta","spec": {
      "fullname": "=concat(@(1,flu),'-',@(1,reportId),Name))"
    }
 },{
    "operation": "shift","spec": {
      "*": "[0].&","@(1,fullname)": "[1].id","#relationship": "[1].type"
    }
}]

如果您需要用空格分隔的两个 JSON 对象,因为您在此问题中标记了 Apache NiFi,您可以将 JoltTransformRecord 与 JsonRecordSetWriter 一起使用,该 JsonRecordSetWriter 的 Output Grouping 属性设置为 One Line Per Object。格式不会与上面完全相同(每个对象都在一行上),但它将是由空格分隔的两个 JSON 对象(某些系统接受/期望这种格式)。