Объединить элементы в JSON в Mule 4 - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть следующий SQL Запрос на выбор сервера:

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

Преобразовано в JSON в DataWeave:

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

Но я хотел бы, чтобы sh было объединено общими элементами для получения желаемого результата:

{
  "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?

Спасибо, Стив

Ответы [ 6 ]

3 голосов
/ 09 февраля 2020

Или даже это

%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
} 
1 голос
/ 09 февраля 2020
(payload  map {
  StateProvinceId: $.StateProvinceId,
  RefId: $.RefId,
  Emails:  Emails.Emails
})[0]
0 голосов
/ 10 февраля 2020

@ Салим Хан ответ совершенно прав. Просто добавьте 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 $
0 голосов
/ 09 февраля 2020

Я немного изменил полезную нагрузку, добавив в нее другой идентификатор провинции.

enter image description here

0 голосов
/ 09 февраля 2020

Это, вероятно, может дать вам более общий c подход:

%dw 2.0
output application/json
fun returnEmail() =  
      payload groupBy($.StateProvinceId) mapObject {
         ($$): $  map {
               Email: $.Email,
               EmailType: $.EmailType
         }
} 


---
payload distinctBy($.StateProvinceId) map {
  StateProvinceId: $.StateProvinceId,
  RefId: $.RefId,
  Emails: returnEmail()[$.StateProvinceId]
}

0 голосов
/ 09 февраля 2020

Я надеюсь, что это дает вам идею.

%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[0]
}   
...