首页 > 解决方案 > 如何使用 NiFi 将平面 JSON 转换为嵌套 JSON

问题描述

输入 JSON :

{

  "type": "mbrInfo",
  "csId": 123456789,
  "insTS": "14-07-201911:55",
  "seqId": 1234565,
  "title": "Mr",
  "fName": "Amit",
  "mName": "",
  "lName": "V",
  "suffix": "Engg",
  "lvlId": "P",
  "lvlType": "LAC",
  "acctStatus": "20",
  "enrlDT": "2016-08-29",
  "vrsnId": 1
}

预期输出 JSON:

{

  "type": "mbrInfo",
  "csId": 123456789,
  "insTS": "14-07-201911:55",
  "seqId": 1234565,
   "name" : [{
  "title": "Mr",
  "fName": "Amit",
  "mName": "",
  "lName": "V",
  "suffix": "Engg"}],
  "lvlId": "P",
  "lvlType": "LAC",
  "acctStatus": "20",
  "enrlDT": "2016-08-29",
  "vrsnId": 1
}.

目前我正在使用带有 JOLT Spec 的 JOLTtransformJSON 处理器:

[
{
    "operation": "shift",
    "spec": {
      "name": {
        "$": "[#1]",
        "@.title": "[#1].title",
        "@.fName": "[#1].fName",
        "@.mName": "[#1].mName",
        "@.lName": "[#1].lName",
        "@.suffix": "[#1].suffix"
      }
    }
  }
]

但我得到的只是 NULL 或原始 JSON(带有差异规范)作为输出。提前致谢。

标签: jsonapache-nifijolt

解决方案


是否打算将所有名称字段放入包含对象的 1 元素数组中。此 JOLT 规范将它们放入name现场的对象中:

[
  {
    "operation": "shift",
    "spec": {
      "title": "name.title",
      "fName": "name.fName",
      "mName": "name.mName",
      "lName": "name.lName",
      "suffix": "name.suffix",
      "*": "&"
    }
  }
]

...并且此规范将它们放入现场的 1 元素数组中name

[
  {
    "operation": "shift",
    "spec": {
      "title": "name[0].title",
      "fName": "name[0].fName",
      "mName": "name[0].mName",
      "lName": "name[0].lName",
      "suffix": "name[0].suffix",
      "*": "&"
    }
  }
]

我在输入中没有看到任何其他位置来获取数组的索引,所以我只使用了0.


推荐阅读