使用 Nifi JoltTransformJson 转换数组中的 JSON 对象

问题描述 投票:0回答:1

我在Nifi中使用JOLTTransformJson处理器。 我的 Json 输入格式有以下 4 种:

[
  {
    "a": "1"
  }
]

[
  {
    "a": "1",
    "b": "2"
  }
]

[
  {
    "a": "1"
  },
  {
    "a": "3"
  }
] 

[
  {
    "a": "1",
    "b": "2"
  },
  {
    "a": "3",
    "b": "4"
  }
]

JSON格式显示为这4种类型,遵循以下规则:

  1. json对象中的属性编号可以有一个或多个;
  2. 顶层数组结构中的对象数量可以有一个或多个;
  3. 每个对象的属性都是相同的。

我尝试使用 JSON 规范转换所有格式的 JSON 数组, 我的 JSON 规范是:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "$": "[#2].fieldName",
          "@": "[#2].fieldValue"
        }
      }
    }
  }
]

我想将 JSON 数组转换为如下形式:

[
  {
    "fieldName": "a",
    "fieldValue": "1"
  }
]

[
  {
    "fieldName": "a",
    "fieldValue": "1"
  },
  {
    "fieldName": "b",
    "fieldValue": "2"
  }
]

[
  [
    {
      "fieldName": "a",
      "fieldValue": "1"
    }
  ],
  [
    {
      "fieldName": "a",
      "fieldValue": "3"
    }
  ]
]

[
  [
    {
      "fieldName": "a",
      "fieldValue": "1"
    },
    {
      "fieldName": "b",
      "fieldValue": "2"
    }
  ],
  [
    {
      "fieldName": "a",
      "fieldValue": "3"
    },
    {
      "fieldName": "b",
      "fieldValue": "4"
    }
  ]
]

但是 JSON 规范无法处理所有情况,尤其是更多对象或更多属性,有一个错误的输出,简单如下:

[
  {
    "fieldName": [
      "a",
      "a"
    ],
    "fieldValue": [
      "1",
      "3"
    ]
  },
  {
    "fieldName": [
      "b",
      "b"
    ],
    "fieldValue": [
      "2",
      "4"
    ]
  }
]

我正在使用调试工具

使用 v0.1.1 的 Jolt 变换演示

请帮助修复 JSON 规范,非常感谢!

json transform etl apache-nifi jolt
1个回答
0
投票

您可以从未包含在方括号内的限定符开始,例如

&2.&1...

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "$": "&2.&1.fieldName",
          "@": "&2.&1.fieldValue"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[#1]"
      }
    }
  }
]

这将处理所有四种情况。

© www.soinside.com 2019 - 2024. All rights reserved.