2016-03-21 13 views
5

Sto tentando di mappare una risposta da una chiamata di terze parti in una struttura diversa utilizzando la trasformazione DataMapper in Mule.Matrice su mappatura piatta in Mule in base alle condizioni

Dal terzo utente riceviamo una serie di elementi (tra le altre cose) e voglio mappare un singolo elemento all'interno dell'array su un oggetto (JSON). Ricevo un identificatore per l'articolo nella richiesta che è disponibile come argomento di input.

La mia domanda è, come posso mappare i campi dell'elemento in base all'identificatore?

risposta Esempio XML

<account> 
    <accountNumber>1234567</accountNumber> 
    <books> 
     <book> 
      <id>1</id> 
      <title>Sample title1</title> 
      <availableFrom>21-03-16</availableFrom> 
     </book> 
     <book> 
      <id>2</id> 
      <title>Sample title2</title> 
      <availableFrom>21-03-16</availableFrom> 
     </book> 
     <book> 
      <id>3</id> 
      <title>Sample title3</title> 
      <availableFrom>21-03-16</availableFrom> 
     </book> 
    </books> 
</account> 

deve diventare:

{ 
    "person": { 
     "accountNumber": 1234567, 
     "selectedBook": { 
      "id": 1, 
      "title": "Sample title1" 
     }, 
     "otherBooks": [ 
      { 
       "id": 2, 
       "title": "Sample title2" 
      }, 
      { 
       "id": 3, 
       "title": "Sample title3" 
      } 
     ] 
    } 
} 

L'id del libro selezionato si svolge in un inputArgument.bookId.

Posso completare la mappatura utilizzando una regola xpath per ciascuno dei campi, tuttavia, devo hardcode il bookId in xpath. Invece, ho bisogno di essere in grado di sostituire l'ID effettivo per quello fornito (e disponibile in inputArgument).

XPath per il titolo

/account/books/book[child::id=1]/title 

Ho provato ad aggiungere MEL per sostituire l'id e varie altre correzioni, ma nulla sembra funzionare. C'è un modo per sostituire il campo bookId.

Nota: A causa di limitazioni del client, non è possibile utilizzare DataWeave.

+0

Puoi provare for-each a/account/libri/libro. Quindi per ogni payload ottieni il valore di ciascun parametro. Il json non è altro che un semplice POJO, quindi trasforma l'oggetto in JSON Transformer dopo aver eseguito la mappatura dal payload for-each. –

+0

Grazie Ralph. Non ho capito bene il concetto di "ottenere il valore di ogni parametro" - potresti fornire un po 'più di informazioni? – user2294382

+0

Intendo quando si esegue iterazione su/account/books/using foreach, quindi è possibile ottenere ciascun elemento del libro. All'interno del foreach puoi trasformare in json e poi fare qualcosa come # [payload.id], # [payload.title] –

risposta

0

Utilizzando la trama di dati, è possibile fare qualcosa di simile.

<dw:transform-message metadata:id="0ce877a9-29ed-401b-bd54-b90d42a1609f" doc:name="Transform Message"> 
       <dw:set-payload><![CDATA[%dw 1.0 
    %var bookId = "1" 
    %var account = payload.account 
    %var books = payload.account.books 
    %output application/json 
    --- 
    { 
     person : { 
      accountNumber: account.accountNumber, 
      selectedBooks: (books.*book map { 
       id : $.id, 
       title: $.title 
      } filter $.id == bookId)[0], 
      otherBooks: books.*book map { 
       id : $.id, 
       title: $.title 
      } filter $.id != bookId 
     } 
    }]]></dw:set-payload> 
      </dw:transform-message> 
+0

Questo è DataWeave giusto? Non DataMapper – user2294382

-1

È necessario utilizzare l'operazione Raggruppa per trasformare il file XML nel formato JSON richiesto. si può fare qualcosa di simile:

Esempio di DataWeave Transformation:

%dw 1.0 
%output application/dw 
--- 
classrooms: payload.school.teachers groupBy $.subject mapObject ((teacherGroup, subject) -> { 
    class: { 
     name: subject, 
     teachers: { (teacherGroup map { 
     teacher:{ 
      name: $.name, 
      lastName: $.lastName 
     } 
     }) }, 
     attendees: { (payload.school.students filter ($.*hobby contains subject) map { 
     attendee: { 
      name: $.name, 
      lastName: $.lastName 
     } 
     }) } 
    } 
}) 
Problemi correlati