2016-08-09 6 views
0

У меня есть JSON, как:Создать сообщение из коллекции коллекций в 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" 
      } 
     ] 
    } 
] 

}

Мне нужно, чтобы преобразовать его в выходной сигнал, как:

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. 

Так далеко я преобразовываю JSON в объект Java, а затем использую область foreach с коллекцией # [полезная нагрузка.EDITORS] Внутри foreach я создаю переменную Intro = «В редакторе # [loadload.EDITOR] есть:« И после этого я потерян. Я попытался установить полезную нагрузку на # [payload.BOOKS], а затем использовать другой файл foreach, но это только показывает последнюю книгу, а также попробуйте Collect Aggregator, но не знаю, что писать в «Message info Mapping».

Как я могу выполнить требуемый выход?

Любая помощь была принята с благодарностью, спасибо заранее.

+0

Благодаря @anupambhusari ваших решений работает как шарм. – Gaven

ответ

0

ИМХО, вам не нужно множества полезной нагрузки внутри Еогеасп области.

Я пробовал следующую конфигурацию и создает список строк, содержащий эти сообщения. Я думаю, вы можете изменить последний процессор сообщений, чтобы отобразить ожидаемый результат (например: добавьте еще foreach или выражение, чтобы извлечь сообщение из конечной полезной нагрузки/ArrayList).

<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"/> 

Если вы предпочитаете использовать DataWeave, то вы можете использовать следующий код:

%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

спасибо за ваш код, он помогает реализовать многое. – Gaven

0

Try следуя с 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 выход для справки. Вы можете преобразовать в java, чтобы получить желаемый результат.

[ 
    "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." 
] 

Надеюсь, это поможет.

0

Dataweave не чувствует себя правильно, особенно потому, что выход является простым txt.

Лично я бы, вероятно, использовал json-to-object (см. Ниже) и parse template.

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

Смежные вопросы