Jolt преобразовать json в json заменить значение из константы

Здравствуйте, мне нужно преобразовать json в json, заменить ключ в зависимости от некоторых значений:

ключ: vdevice-name

 if value of key is 10.127.200.1 replace with "Alfa"
 if value of key is 10.127.200.2 replace with "beta"
 if value of key is 10.127.200.3 replace with "omega"

Введите JSON:

 {
   "data": [
     {
       "src-ip": "10.161.25.170",
       "dst-ip": "10.161.25.182",
       "vdevice-name": "10.127.200.1",
       "color": "mpls",
       "src-port": 12346,
       "createTimeStamp": 1623334401569,
       "system-ip": "10.157.96.2",
       "dst-port": 12346,
       "site-id": 141011085,
       "transitions": 0,
       "vdevice-host-name": "AEXI630_XITO098_E_COUNTRY_2081",
       "local-color": "mpls",
       "detect-multiplier": "7",
       "vdevice-dataKey": "10.127.200.1-mpls-10.157.96.2-mpls-ipsec",
       "@rid": 168682,
       "proto": "ipsec",
       "lastupdated": 1623334401562,
       "tx-interval": 1010,
       "state": "up",
       "uptime-date": 1623334260000
     },
     {
       "src-ip": "10.161.25.170",
       "dst-ip": "10.162.45.94",
       "vdevice-name": "10.127.200.2",
       "color": "mpls",
       "src-port": 12346,
       "createTimeStamp": 1623334402985,
       "system-ip": "10.157.16.2",
       "dst-port": 12346,
       "site-id": 142011050,
       "transitions": 0,
       "vdevice-host-name": "AEXI630_XITO098_E_COUNTRY_2081",
       "local-color": "mpls",
       "detect-multiplier": "7",
       "vdevice-dataKey": "10.127.200.1-mpls-10.157.16.2-mpls-ipsec",
       "@rid": 206290,
       "proto": "ipsec",
       "lastupdated": 1623334401562,
       "tx-interval": 1000,
       "state": "up",
       "uptime-date": 1623334260000
     }
   ]
}

желаемый выходной JSON:

{
   "data": [
     {
       "src-ip": "10.161.25.170",
       "dst-ip": "10.161.25.182",
       "vdevice-name": "Alfa",
       "color": "mpls",
       "src-port": 12346,
       "createTimeStamp": 1623334401569,
       "system-ip": "10.157.96.2",
       "dst-port": 12346,
       "site-id": 141011085,
       "transitions": 0,
       "vdevice-host-name": "AEXI630_XITO098_E_COUNTRY_2081",
       "local-color": "mpls",
       "detect-multiplier": "7",
       "vdevice-dataKey": "10.127.200.1-mpls-10.157.96.2-mpls-ipsec",
       "@rid": 168682,
       "proto": "ipsec",
       "lastupdated": 1623334401562,
       "tx-interval": 1010,
       "state": "up",
       "uptime-date": 1623334260000
     },
     {
       "src-ip": "10.161.25.170",
       "dst-ip": "10.162.45.94",
       "vdevice-name": "beta",
       "color": "mpls",
       "src-port": 12346,
       "createTimeStamp": 1623334402985,
       "system-ip": "10.157.16.2",
       "dst-port": 12346,
       "site-id": 142011050,
       "transitions": 0,
       "vdevice-host-name": "AEXI630_XITO098_E_COUNTRY_2081",
       "local-color": "mpls",
       "detect-multiplier": "7",
       "vdevice-dataKey": "10.127.200.1-mpls-10.157.16.2-mpls-ipsec",
       "@rid": 206290,
       "proto": "ipsec",
       "lastupdated": 1623334401562,
       "tx-interval": 1000,
       "state": "up",
       "uptime-date": 1623334260000
     }
   ]
}

Я пробую следующую спецификацию:

 [
   {
     "operation": "shift",
     "spec": {
       "data": {
         "*": {
           "vdevice-name": {
             "10.127.200.1": {
               "#Alfa": "vdevice-name"
             },
             "10.127.200.2": {
               "#beta": "vdevice-name"
             },
             "10.127.200.3": {
               "#omega": "vdevice-name"
             }
           },
           "*": "&"
         }
       }
     }
   }
]

Но мой вывод:

{
  "src-ip" : [ "10.161.25.170", "10.161.25.170" ],
  "dst-ip" : [ "10.161.25.182", "10.162.45.94" ],
  "vdevice-name" : [ "Alfa", "beta" ],
  "color" : [ "mpls", "mpls" ],
  "src-port" : [ 12346, 12346 ],
  "createTimeStamp" : [ 1623334401569, 1623334402985 ],
  "system-ip" : [ "10.157.96.2", "10.157.16.2" ],
  "dst-port" : [ 12346, 12346 ],
  "site-id" : [ 141011085, 142011050 ],
  "transitions" : [ 0, 0 ],
  "vdevice-host-name" : [ "AEXI630_XITO098_E_COUNTRY_2081", "AEXI630_XITO098_E_COUNTRY_2081" ],
  "local-color" : [ "mpls", "mpls" ],
  "detect-multiplier" : [ "7", "7" ],
  "vdevice-dataKey" : [ "10.127.200.1-mpls-10.157.96.2-mpls-ipsec","10.127.200.1-mpls-10.157.16.2-mpls-ipsec" ],
  "@rid" : [ 168682, 206290 ],
  "proto" : [ "ipsec", "ipsec" ],
  "lastupdated" : [ 1623334401562, 1623334401562 ],
  "tx-interval" : [ 1010, 1000 ],
  "state" : [ "up", "up" ],
  "uptime-date" : [ 1623334260000, 1623334260000 ]
}

Мне нужна помощь :)


person Jesus Barrios    schedule 30.06.2021    source источник
comment
Я думаю, что смогу сделать это следующим образом:   -  person Jesus Barrios    schedule 01.07.2021


Ответы (2)


Я сделал это так:

[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": {
          "vdevice-name": {
            "10.127.200.1": {
              "#alfa": "data[&3].vdevice-name"
            },
            "10.127.200.2": {
              "#omega": "data[&3].vdevice-name"
            },
            "*": {
              "$": "data[&3].vdevice-name"
            }
          },
          "*": "data[&1].&"
        }
      }
    }
  }
]
person Jesus Barrios    schedule 01.07.2021

Действительно, ваше решение работает, подключи могут быть преобразованы в замены, чтобы сделать их динамическими, а не повторять их по отдельности, например

[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": {
          "vdevice-name": {
            "10.127.200.1": {
              "#alfa": "&4[&3].&2"
            },
            "10.127.200.2": {
              "#omega": "&4[&3].&2"
            },
            "*": {
              "$": "&4[&3].&2"
            }
          },
          "*": "&2[&1].&"
        }
      }
    }
  }
]

где &4 означает подняться на 4 уровня и прочитать ключ (data), а &2 означает подняться на 2 уровня и прочитать ключ (vdevice-name) соответственно.

person Barbaros Özhan    schedule 01.07.2021
comment
Спасибо, Ожан, решение, которое вы мне указали, должно применяться в случае, если ключ не является данными, верно? - person Jesus Barrios; 01.07.2021
comment
пожалуйста, @JesusBarrios. Нет, & 4 заменяет data, & 2 заменяет vdevice-name соответственно. Например. Это означает подняться на 4 или 2 уровня и прочитать ключ. С наилучшими пожеланиями. - person Barbaros Özhan; 01.07.2021