动态查询后在JSON数组中添加新项目

问题描述 投票:0回答:2

我的示例有效载荷如下。

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

我需要的是对这两个变量进行动态查找,并在主payload中添加新的属性,如下所示。

{
  "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中,得到 下载. 这必须通过与ID匹配添加到代码数组中。如果没有找到值,则插入null。我在dataweave 1.0上。

先谢谢你

mule mule-studio mule-component dataweave anypoint-studio
2个回答
4
投票

你可以试试下面的脚本。有两个查询,第一个是来自于 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
投票

我没有能力使用 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")
        })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.