【问题标题】:Merge elements in JSON within Mule 4在 Mule 4 中合并 JSON 中的元素
【发布时间】:2020-02-10 07:15:30
【问题描述】:

我有以下 SQL Server 选择查询:

SELECT s.RefId
          ,s.LocalId
          ,s.StateProvinceId
          ,s.SchoolName
          ,e.Email
          ,e.EmailType
      FROM SchoolInfo s
      LEFT OUTER JOIN SchoolEmail e
      ON    e.SchoolRefId = s.RefId
      WHERE s.RefId = :ref_id

在 DataWeave 中转换为 JSON:

%dw 2.0
output application/json
---
payload

输出:

[
  {
    "StateProvinceId": "SA",
    "RefId": "7FDF722B-6BBA-4BF0-8205-A5380B269EF1",
    "EmailType": "prm",
    "LocalId": "1",
    "SchoolName": "Steve's School",
    "Email": "steven@email.com"
  },
  {
    "StateProvinceId": "SA",
    "RefId": "7FDF722B-6BBA-4BF0-8205-A5380B269EF1",
    "EmailType": "sec",
    "LocalId": "1",
    "SchoolName": "Steve's School",
    "Email": "test@gmail.com"
  }
]

但我希望将其通过公共元素合并以生成所需的输出:

{
  "RefId": "7FDF722B-6BBA-4BF0-8205-A5380B269EF1",
  "LocalId": "1",
  "StateProvinceId": "SA",
  "SchoolName": "Steve's School",
  "Emails": [
    {
      "Email": "steven@email.com",
      "EmailType": "prm"
    },
    {
      "Email": "test@gmail.com",
      "EmailType": "sec"
    }
  ]
}

如何在 Mule 4 中做到这一点?

谢谢, 史蒂夫

【问题讨论】:

    标签: json mule dataweave mulesoft


    【解决方案1】:

    甚至这个

    %dw 2.0
    output application/json
    var Emails =  
        "Emails": payload map {
          Email: $.Email,
          EmailType: $.EmailType
    }
    
    ---
    payload distinctBy($.StateProvinceId) map {
      StateProvinceId: $.StateProvinceId,
      RefId: $.RefId,
      Emails:  Emails.Emails
    } 
    

    【讨论】:

    • 谢谢萨利姆! ---之后我一直在尝试做所有事情,我什至没有想到要像这样提取电子邮件!问题:您为什么要使用 distinctBy StateProvinceID?这看起来像是生成了一个数组: [ { "RefId": "7FDF722B-6BBA-4BF0-8205-A5380B269EF1", "LocalId": "1", "SchoolName": "Steve's School", "StateProvinceId": "SA" ,“电子邮件”:[ {“电子邮件”:“steven@gmail.com”,“电子邮件类型”:“prm”},{“电子邮件”:“test@gmail.com”,“电子邮件类型”:“秒”}] } ] 我们如何移除顶部数组?
    • distinctBy 这样您就不会在输入中重复只需要一次的键。你也可以做这样的事情来获得输出
    • 您是否碰巧有一些其他输入(不同的 stateProvinceId)有助于使其成为通用解决方案。
    • RefId 是唯一键,所以我认为该元素上的 distinctBy 应该没问题。 “你也可以做这样的事情来获得输出” - 你完成你的消息了吗?
    • yup .. 通过访问 [0] 最终数组的元素在下面发布
    【解决方案2】:

    @Salim Khan 的回答完全正确。只需添加 reduce 以将数组转换为对象作为最后一位,以与您的响应格式完全匹配

    %dw 2.0
    var email =   payload map (item,index) -> { 
    "Email":item.Email,
    "EmailType":item.EmailType }
    
    output application/json
    ---
     payload distinctBy($.StateProvinceId) map  {
    "StateProvinceId": $.StateProvinceId,
    "RefId": $.RefId,
     "LocalId":  $.LocalId,
    "SchoolName": $.SchoolName,
    "Emails":email } reduce $
    

    【讨论】:

    • reduce $是否比[0]数组好?
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多