Как написать JOLT Spec для вложенных массивов? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь преобразовать JSON, используя JOLT. Этот JSON состоит из вложенных массивов, и я не могу получить правильное преобразование.

Это оригинальный JSON. Обратите внимание, что всегда будет один массив «результатов» с одним объектом. Этот объект всегда будет содержать один массив строк. Я хочу, чтобы поля из каждого элемента в массиве строк.

{
  "results": [
    {
      "total_rows": 1390,
      "offset": 0,
      "rows": [
        {
          "id": "00407a53-5f45-11e9-8b9c-84cc507154b4",
          "key": "weather",
          "value": {
            "_id": "00407a53-5f45-11e9-8b9c-84cc507154b4",
            "_rev": "1-e996404ab9445c8ff753d45f61b5dc16",
            "deviceType": "home-iot",
            "deviceId": "12345",
            "eventType": "weather",
            "format": "json",
            "timestamp": "2019-04-15T06:09:17.311Z",
            "data": {
              "temperature": 44,
              "humidity": 75
            }
          }
        },
        {
          "id": "00901ed4-5f44-11e9-94a1-84cc507154b4",
          "key": "weather",
          "value": {
            "_id": "00901ed4-5f44-11e9-94a1-84cc507154b4",
            "_rev": "1-519c4edaeb15ed2ca102d4aabe4a0339",
            "deviceType": "home-iot",
            "deviceId": "12345",
            "eventType": "weather",
            "format": "json",
            "timestamp": "2019-04-15T06:02:08.337Z",
            "data": {
              "temperature": -7,
              "humidity": 49
            }
          }
        }
      ]
    }
  ]
}

Это спецификация, которую я написал:

[
  {
    "operation": "shift",
    "spec": {
      "results": {
        "*": {
          "rows": {
            "*": {
              "value": {
                "deviceId": "[&4].deviceId",
                "deviceType": "[&4].deviceType",
                "eventType": "[&4].eventType",
                "timestamp": "[&4].timestamp",
                "data": {
                  "*": "[&5].&"
                }
              }
            }
          }
        }
      }
    }
  }
]

Ожидаемый JSON:

[{
    "deviceId": "12345",
    "deviceType": "home-iot",
    "eventType": "weather",
    "timestamp": "2019-04-15T06:09:17.311Z",
    "temperature": 44,
    "humidity": 75
}, {
    "deviceId": "12345",
    "deviceType": "home-iot",
    "eventType": "weather",
    "timestamp": "2019-04-15T06:02:08.337Z",
    "temperature": -7,
    "humidity": 49
}]

Однако моя спецификация возвращает следующий вывод:

[ {
  "deviceId" : [ "12345", "12345" ],
  "deviceType" : [ "home-iot", "home-iot" ],
  "eventType" : [ "weather", "weather" ],
  "timestamp" : [ "2019-04-15T06:09:17.311Z", "2019-04-15T06:02:08.337Z" ],
  "temperature" : [ 44, -7 ],
  "humidity" : [ 75, 49 ]
} ]

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

1 Ответ

2 голосов
/ 16 апреля 2019

Вы используете индекс массива верхнего уровня с &4 и &5, попробуйте вместо него &2 и &3 (индекс rows):

[
  {
    "operation": "shift",
    "spec": {
      "results": {
        "*": {
          "rows": {
            "*": {
              "value": {
                "deviceId": "[&2].deviceId",
                "deviceType": "[&2].deviceType",
                "eventType": "[&2].eventType",
                "timestamp": "[&2].timestamp",
                "data": {
                  "*": "[&3].&"
                }
              }
            }
          }
        }
      }
    }
  }
]
...