无法形成 JOLT 模式以在 NiFi 中转换 JSON

Unable to form the JOLT schema to transform JSON in NiFi

我正在尝试在 Apache NiFi 中使用 jolt JSON 到 JSON 的转换。我想将一个 JSON 转换成另一种格式。

这是我的原创JSON:

{
  "total_rows": 5884,
  "offset": 0,
  "rows": [
    {
      "id": "03888c0ab40c32451a018be6b409eba3",
      "key": "03888c0ab40c32451a018be6b409eba3",
      "value": {
        "rev": "1-d5cc089dd8682422962ccab4f24bd21b"
      },
      "doc": {
        "_id": "03888c0ab40c32451a018be6b409eba3",
        "_rev": "1-d5cc089dd8682422962ccab4f24bd21b",
        "topic": "iot-2/type/home-iot/id/1234/evt/temp/fmt/json",
        "payload": {
          "temperature": 36
        },
        "deviceId": "1234",
        "deviceType": "home-iot",
        "eventType": "temp",
        "format": "json"
      }
    },
    {
      "id": "03888c0ab40c32451a018be6b409f163",
      "key": "03888c0ab40c32451a018be6b409f163",
      "value": {
        "rev": "1-dee82cbb1b5ffa8a5e974135eb6340c5"
      },
      "doc": {
        "_id": "03888c0ab40c32451a018be6b409f163",
        "_rev": "1-dee82cbb1b5ffa8a5e974135eb6340c5",
        "topic": "iot-2/type/home-iot/id/1234/evt/temp/fmt/json",
        "payload": {
          "temperature": 22
        },
        "deviceId": "1234",
        "deviceType": "home-iot",
        "eventType": "temp",
        "format": "json"
      }
    }
  ]
}

我想把这个改成下面的样子JSON:

[
   {
      "temperature":36,
      "deviceId":"1234",
      "deviceType":"home-iot",
      "eventType":"temp"
   },
   {
      "temperature":22,
      "deviceId":"1234",
      "deviceType":"home-iot",
      "eventType":"temp"
   }
]

这是我的规格:

[
  {
    "operation": "shift",
    "spec": {
      "rows": {
        "*": {
          "doc": {
            "deviceId": "[&1].deviceId",
            "deviceType": "[&1].deviceType",
            "eventType": "[&1].eventType",
            "payload": {
              "*": "[&1]"
            }
          }
        }
      }
    }
  }
]

我一直收到空响应。我是新手,文档不是很容易理解。有人可以帮忙吗?

因为你在数组索引之后 "down" 一级,当你到达 deviceId 时,你距离索引 2 级。将除 payload 之外的所有 &1 替换为 &2。在那种情况下,您是另一个级别 "down",因此您需要使用 &3 作为索引。您还需要获取与 *(例如 temperature)匹配的任何内容,并将传出字段名称设置为相同的内容,方法是在数组索引后使用 &。这是生成的规范:

[
  {
    "operation": "shift",
    "spec": {
      "rows": {
        "*": {
          "doc": {
            "deviceId": "[&2].deviceId",
            "deviceType": "[&2].deviceType",
            "eventType": "[&2].eventType",
            "payload": {
              "*": "[&3].&"
            }
          }
        }
      }
    }
  }
]