отображать вложенную коллекцию с помощью dataweave

Я хочу отобразить следующий вывод (json), ввод от курсоров pl / sql, мои вопросы:

  1. как отобразить этот вывод?
  2. какой ввод ожидается для этого вывода?
  3. как объединить 2 результата курсора с помощью клавиши personId?

Спасибо

Вход:

personCursor: 
[{personName=a,personId=1}, {personName=b,personId=2}]
*contactCursor*
[{personId=1, firstName==x, phone=123}, {personId=1, firstName==y, phone=234}, {personId=2, firstName==z, phone=345},{personId=2, firstName==w, phone=456}]
**output:**
[
  {
    "personName": "a",
    "personId": "1",
    "contacts": 
            [
                {
                    "firstname": "x",
                    "phone": 123
                },
                {
                    "firstname": "y",
                    "phone": 234
                },
            ]
  },
 {
    "personName": "b",
    "personId": "2",
    "contacts": 
            [
                {
                    "firstname": "z",
                    "phone": 345
                },
                {
                    "lastname": "w",
                    "phone": 456
                },
            ]
  }
]

person Lei    schedule 11.02.2017    source источник


Ответы (2)


Для вывода вы должны использовать скрипт вроде

%dw 1.0
%output application/json
%var contactLookup = payload groupBy $.personId
---
flowVars.PersonCursor map {
    ($),
    contacts : contactLookup[$.personId]
}

Где полезная нагрузка - это contactCursor, а flowVars.PersonCursor - это personCursor. Данный код объединит данные с помощью поиска по Hashmap. В случае курсора pl / sql ввод будет java.

HTH

person AnupamBhusari    schedule 13.02.2017
comment
какой тип данных для contactCursor и flowVars.PersonCursor? Я установил оба как json, он работает только для записи 1st PersonCursor, получаю следующий вывод: {output: [{personName: a, personId: 1, contacts: [{personId: 1, firstName: x, phone: 123}, {personId : 1, firstName: y, phone: 234}]}, {personName: b, personId: 2, contacts: null}]} - person Lei; 13.02.2017
comment
Json, а также java в порядке. Но если вы получаете ответ, поскольку Iterator измените код как %var contactLookup = payload map $ groupBy $.personId - person AnupamBhusari; 16.02.2017

Другим способом вы можете сделать это, используя 2 оператора карты и цикл по массивам и построение выходного Json вместе с условием фильтрации, чтобы связать контакты с нужным человеком. Должно быть что-то вроде строк ниже:

PersonCursor map(v1,i1) {
   personName": $.personName,
    "personId": $.personId,
    contacts : contactCursor map {
"firstname": $.firstname,
"phone": $.phone
           } filter $.personId == v1.personId
}
person Srinivas    schedule 08.03.2018