动态查找后将新项目添加到 JSON 数组

Add new items to JSON array after dynamic lookup

我的示例负载如下。

{
  "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
    }
  ]
}

我需要对这 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 中的 value 对 var2 中的 TempId 进行查找,并得到 Desc.必须通过与 ID 匹配将其添加到代码数组中。如果未找到值,则插入 null。 我正在使用 dataweave 1.0

提前致谢

您可以试试下面的脚本。有两个查找,第一个是从 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)
  })
}

我无法用 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")
        })
    }
}