2016-08-09 97 views
0

Ich habe einen JSON wie:eine Nachricht aus einer Sammlung von Sammlungen in Mule ESB

{ 
"EDITORS" : [{ 
     "EDITOR" : "MCGRAM HILL", 
     "BOOKS" : [{ 
       "NAME" : "DIFFERENTIAL CALCULUS", 
       "YEAR" : "1995", 
       "TIMES_READ" : "135" 
      }, { 
       "NAME" : "2012 THE END OF THE WORLD", 
       "YEAR" : "2012,", 
       "TIMES_READ" : "56" 
      } 
     ] 
    }, { 
     "EDITOR" : "DEMIDOVICH", 
     "BOOKS" : [{ 
       "NAME" : "SOME TITTLE", 
       "YEAR" : "1975,", 
       "TIMES_READ" : "154" 
      }, { 
       "NAME" : "THE LITTLE PRINCE", 
       "YEAR" : "1987,", 
       "TIMES_READ" : "57" 
      } 
     ] 
    }, { 
     "EDITOR" : "ADRIAN LOPEZ ASC.", 
     "BOOKS" : [{ 
       "NAME" : "SOMETHING", 
       "YEAR" : "2008,", 
       "TIMES_READ" : "10" 
      } 
     ] 
    } 
] 

}

Ich brauche es in eine Ausgabe zu verwandeln wie:

payload[0]= The editor MCGRAM HILL has: 
The book DIFFERENTIAL CALCULUS published in 1995 has been readed 135 times. 
The book 2012 THE END OF THE WORLD published in 2012 has been readed 56 times. 

payload[1]= The editor DEMIDOVICH has: 
The book SOME TITTLE published in 1975 has been readed 154 times. 
The book THE LITTLE PRINCE published in 1987 has been readed 57 times. 

payload[2]= The editor ADRIAN LOPEZ ASC. has: 
The book SOMETHING published in 2008 has been readed 10 times. 

So Bisher transformiere ich den JSON in ein Java Objekt, dann benutze einen foreach scope mit der Collection # [payload.EDITORS] In der foreach erzeuge ich eine Variable Intro = "Der Editor # [payload.EDITOR] hat:" Und danach bin ich verloren. Ich habe versucht, Payload auf # [Payload.BOOKS] zu setzen und dann eine andere Foreach, aber dies zeigt nur das letzte Buch, und habe auch Collection Aggregator versuchen, aber nicht wissen, was in "Message Info Mapping" zu schreiben.

Wie kann ich die erforderliche Ausgabe erreichen?

Jede Hilfe könnte sehr geschätzt werden, danke im Voraus.

+0

Dank @anupambhusari Ihre Lösungen funktioniert wie Charme. – Gaven

Antwort

0

IMHO, müssen Sie nicht setzen Nutzlast innerhalb der foreach Bereich.

Ich habe versucht, die folgende Konfiguration und es erzeugt eine Liste der Zeichenfolge, die diese Nachricht enthält. Ich glaube, Sie können den letzten Nachrichtenprozessor ändern die erwartete Ausgabe angezeigt werden (z .: fügen Sie eine weiteren foreach oder Ausdruck die Nachricht von der endgültigen Nutzlast/Arraylist zu extrahieren).

<json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/> 
<set-variable variableName="messageMapping" value="#[new java.util.ArrayList()]" doc:name="Variable"/> 
<foreach collection="#[payload.EDITORS]" doc:name="For Each"> 
    <set-variable variableName="messageEditor" value="The editor #[payload.EDITOR] has: " doc:name="Variable"/> 
    <foreach collection="#[payload.BOOKS]" doc:name="For Each"> 
     <expression-transformer expression="#[flowVars.messageEditor += &quot;\r\nThe book &quot; + payload.NAME + &quot; published in &quot; + payload.YEAR + &quot; has been readed &quot; + payload.TIMES_READ + &quot; times.&quot;]" doc:name="Expression"/> 
    </foreach> 
    <expression-transformer expression="#[flowVars.messageMapping.add(flowVars.messageEditor)]" doc:name="Expression"/> 
</foreach> 
<set-payload value="#[flowVars.messageMapping]" doc:name="Set Payload"/> 
<logger message="#[payload]" level="INFO" doc:name="Logger"/> 

Wenn Sie es vorziehen DataWeave zu verwenden, dann können Sie den folgenden Code verwenden:

%dw 1.0 
%output application/java 
--- 
payload.EDITORS map (
    'The editor ' ++ $.EDITOR ++ ' has:\r\n' ++ 
    ($.BOOKS map (
     'The book ' ++ $.NAME ++ ' published in ' ++ $.YEAR ++ ' has been readed ' ++ $.TIMES_READ ++ ' times.' 
    ) joinBy '\r\n') 
) 
+0

danke für deinen code, es hilft viel zu realisieren. – Gaven

0

Versuchen folgenden mit dataweave

%dw 1.0 
%output application/json 
--- 
{(payload.EDITORS map ((data, index) -> { 
    payload : "The editor " ++ data.EDITOR ++ " has:\r\n" ++ 
    {(data.BOOKS map { 
     pqr : "The book " ++ $.NAME ++ " published in " ++ $.YEAR ++ " has been readed " ++ $.'TIMES_READ' ++ " times." 
    })} pluck $ joinBy "\r\n" 
}))} pluck $ 

Json Ausgabe als Referenz. Sie können in Java umwandeln, um die gewünschte Ausgabe zu erhalten.

[ 
    "The editor MCGRAM HILL has:\r\nThe book DIFFERENTIAL CALCULUS published in 1995 has been readed 135 times.\r\nThe book 2012 THE END OF THE WORLD published in 2012, has been readed 56 times.", 
    "The editor DEMIDOVICH has:\r\nThe book SOME TITTLE published in 1975, has been readed 154 times.\r\nThe book THE LITTLE PRINCE published in 1987, has been readed 57 times.", 
    "The editor ADRIAN LOPEZ ASC. has:\r\nThe book SOMETHING published in 2008, has been readed 10 times." 
] 

Hoffe, das hilft.

0

Dataweave fühlt sich nicht wie der richtige Ansatz, vor allem, weil die Ausgabe plain txt ist.

Persönlich würde ich wahrscheinlich json-to-object (siehe unten) und parse template verwenden.

<json:json-to-object-transformer returnClass="java.util.Map" />