Добавлять новые элементы в массив JSON после динамического поиска c - PullRequest
0 голосов
/ 04 мая 2020

Мой пример полезной нагрузки приведен ниже.

{
  "Identifier": "1111111111",
  "Type": "Test",
  "Codes": [
    {
      "CodeId": "112233-ABC",
      "Code": {
        "ID": "112233",
        "Name": "ABC"
      }
    },
    {
      "CodeId": "445566-DEF",
      "Code": {
        "ID": "445566",
        "Name": "DEF"
      }
    },
    {
      "CodeId": "778899-GHI",
      "Code": {
        "ID": "778899",
        "Name": "GHI"
      }
    }
  ]
}

У меня есть 2 переменные сеанса, а также приведенные ниже:

%var var1 = 
{
  "112233": "900123",
  "445566": "900456",
  "778899": "900789"
}

%var var2 = 
{
  "value": [
    {
      "Desc": "Alpha",
      "TempId": 900123
    },
    {
      "Desc": "Bravo",
      "TempId": 900456
    },
    {
      "Desc": "Charlie",
      "TempId": 900789
    }
  ]
}

Мне нужно выполнить динамический c поиск с этими 2 переменными и добавьте новый атрибут (атрибуты) в основную полезную нагрузку, как указано ниже:

{
  "Identifier": "1111111111",
  "Type": "Test",
  "Codes": [
    {
      "CodeId": "112233-ABC",
      "Code": {
        "ID": "112233",
        "Name": "ABC",
        "Description": "Alpha"
      }
    },
    {
      "CodeId": "445566-DEF",
      "Code": {
        "ID": "445566",
        "Name": "DEF",
        "Description": "Bravo"
      }
    },
    {
      "CodeId": "778899-GHI",
      "Code": {
        "ID": "778899",
        "Name": "GHI",
        "Description": "Charlie"
      }
    }
  ]
}

Идея состоит в том, чтобы выполнить поиск, используя значение из var1 против TempId в var2 и получим Des c. Это должно быть добавлено в массив Code путем сопоставления с ID. Если значение не найдено, вставьте ноль. Я нахожусь на dataweave 1.0

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

Вы можете попробовать приведенный ниже скрипт. Есть два поиска, сначала с var для получения TempId, а затем с добавлением Desc поля

%dw 1.0
%input payload application/json
%output application/json
%var var1 = 
{
  "112233": "900123",
  "445566": "900456",
  "778899": "900789"
}
%var var2 = 
{
  "value": [
    {
      "Desc": "Alpha",
      "TempId": 900123
    },
    {
      "Desc": "Bravo",
      "TempId": 900456
    },
    {
      "Desc": "Charlie",
      "TempId": 900789
    }
  ]
}
%var var2Grouped = var2.value groupBy $.TempId
%function addDesc(id) var2Grouped[var1[id]][0].Desc  default {}
---
{
  Identifier: payload.'Identifier',
  'Type': payload.'Type',
  "Codes": payload."Codes" map ((code) -> {
    CodeId: code.CodeId,
    Code: code.Code ++ addDesc(code.Code.ID)
  })
}
1 голос
/ 04 мая 2020

У меня нет возможности проверить это с DW 1.0, но вы можете попробовать эту функцию. Он получит только первое совпадение, но также установит описание на null, если совпадение не найдено. (Вы также можете использовать здесь функцию filter вместо [?(...)])

%function getDescription(code) { 
    Description: var2.value[?(var1[code] ~= $.TempId)][0].Desc default null
}

И тогда это будет выражение для установки полезной нагрузки результата

{
    Identifier: payload.Identifier,
    Type: payload.Type,
    Codes: payload.Codes map {
        ($ mapObject {
            (($$): $ ++ getDescription($.ID)) if(($$ as :string) == "Code"),
            (($$): $) if (($$ as :string) != "Code")
        })
    }
}
...