Невозможно сформировать схему JOLT для преобразования JSON в NiFi - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь использовать преобразование JSON в JSON в Apache NiFi. Я хочу преобразовать один 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]"
            }
          }
        }
      }
    }
  }
]

Я продолжаю получать нулевой ответ. Я новичок в этом, и документацию не очень легко понять. Может кто-нибудь помочь, пожалуйста?

1 Ответ

3 голосов
/ 09 апреля 2019

Поскольку вы «опускаетесь» еще на один уровень после индекса массива, к тому времени, как вы достигнете deviceId, вы будете на 2 уровня дальше от индекса.Замените все &1 с &2, кроме payload.В этом случае вы находитесь на другом уровне «вниз», поэтому вы можете использовать &3 для индекса.Вам также нужно взять то, что соответствует * (temperature, например), и установить имя исходящего поля на то же самое, используя & после индекса массива.Вот итоговая спецификация:

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