Как преобразовать сложный вложенный массив JSON с помощью JOLT? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь преобразовать вложенные массивы в объекты в зависимости от количества значений во втором вложенном массиве. Я не могу получить количество полей значений и использовать это в качестве ключа в моей спецификации. Теперь это мой входной файл JSON:

{
 "meta": {
   "regId": "us",
   "cId": "SomeProduct",
   "weId": 15

 },
 "data": {
   "name": "R",
   "details": {
     "headers": [
       "id",
       "cityId",
       "cityName"

     ],
     "values": [
       [
         1539,
         17,
         "Moskow"
       ],
       [
         1539,
         17,
         "Berlin"
       ],
       [
        1539,
         17,
         "Vienna"
       ]
     ]
   }
 }
}

Это мой желаемый вывод JSON:

[
    {"regId": "us",
        "cId": "SomeProduct",
        "weId": 15,
        "name":"R",
        "id":1539,
        "cityId":17,
        "cityName":Moskow
    },
    {"regId": "us",
        "cId": "SomeProduct",
        "weId": 15,
        "name":"R",
        "id":1540,
        "cityId":11,
        "cityName":Berlin
    },
    {"regId": "us",
        "cId": "SomeProduct",
        "weId": 15,
        "name":"R",
        "id":151,
        "cityId":18,
        "cityName":Vienna
    }
]

Пока это моя спецификация

[
  {
    "operation": "shift",
    "spec": {
      "meta": {
        "*": "&"
      },
      "data": {
        "name": "&",
        "details": {
          "values": {
            "*": {

              "*": "@(3,headers[&])"
            }
          }
        }
      }
    }
  }
]

У кого-нибудь была похожая ситуация?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019
[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "details": {
          "values": {
            "*": {
              "*": {
                // @ takes value of each element and put it to a 
                // correspondent data2 element ([&2] - go up three levels to 
                // the first * and takes number of element)
                // @(4,headers[&0]) - go up 5 levels and take headers[&0] 
                // occurence (&0 - go up 1 level - second * and takes number 
                //of element)
                "@": "data2[&2].@(4,headers[&0])" 
              },
              // go up four levels and grab name value and put it into 
              // data2[&1].name
              "@(3,name)": "data2[&1].name",
              "@(4,meta)": { // go up five levels and grab meta value
                "*": "data2[&2].&" // for each value put it to data2[&2] as it is
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",  // second shift operation to modify result of this above
    "spec": {
      "data2": ""  // removing data2 header
    }
  }
]
0 голосов
/ 18 мая 2019

похоже, что я добился прогресса, но все же не очень хорошо смеется:

текущая спецификация:

[
  {
    "operation": "shift",
    "spec": {
      "meta": {
        "*": "&"
      },
      "data": {
        "name": "&",
        "details": {
          "values": {
            "*": {
              "*": "&.@(3,headers[&1])",
              "*": "&1"
            }
          }
        }
      }
    }
  }
]

вывод:

{
  "regId" : "us",
  "cId" : "SomeProduct",
  "weId" : 15,
  "name" : "R",
  "0" : [ 1539, 17, "Moskow" ],
  "1" : [ 1540, 18, "Berlin" ],
  "2" : [ 1541, 19, "Vienna" ]
    }

Должна ли это быть вложенная спецификация, а не одна?

...