2014-02-05 3 views
2

Я использую Mule 3.4 CE и я Грядет JSON данных через HTTP в следующем формате:Извлечение массива из JSON в мул ESB

{ 
    "People" : [ 
    { 
     "Details" : 
     { 
     "Name" : "John Smith", 
     "Email" : "[email protected]" 
     } 
    }, 
    { 
     "Details" : 
     { 
     "Name" : "Tim Smith", 
     "Email" : "[email protected]" 
     } 
    }, 
    { 
     "Details" : 
     { 
     "Name" : "Ken Smith", 
     "Email" : "[email protected]" 
     } 
    }, 
} 

мне нужно, чтобы извлечь сообщения электронной почты и поиска контакта с Salesforce эти письма и в то же время я хочу сохранить полезную нагрузку JSON. Итак, мой вопрос: как я могу извлечь электронные письма через MEL? (например, «Люди/Детали/*/Электронная почта»). Я знаю, что это неверно, но я ищу правильный синтаксис.

Редактировать: Я хочу извлечь электронные письма одним выстрелом а не индексирования (например, для людей,/детали [0] .EMAIL, возможно, с использованием MEL.

ответ

14

Там лучший способ запроса JSON является превратить его в карту.

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

А затем запросить его с помощью MEL как стандартный синтаксис MVEL или Java

<logger message="#[payload.People[0].Details.email]" level="INFO" /> 

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

<enricher target="#[flowVars.myJsonMap]"> 
    <json:json-to-object-transformer returnClass="java.util.HashMap" /> 
</enricher> 

И запросить переменную вместо полезной нагрузки:

<logger message="#[flowVars.myJsonMap.People[0].Details.email]" level="INFO" /> 

Вы также может отобразить json в пользовательский класс с использованием Jackson и изменить атрибут returnClass для вашего класса.

Этот MEL шпаргалку детали обработки JSON с MEL, а также как обрабатывать карты, массивы и т.д.: http://www.mulesoft.org/documentation/display/current/MEL+Cheat+Sheet

Примечание: Вы можете встретить # [JSON:] оценщик, но это не рекомендуется в пользу вышеприведенного подхода.

UPDATE:

Если вы хотите, чтобы захватить все письма сразу можно использовать MVEL проекции:

<enricher target="#[flowVars.myJsonMap]" source="#[(Details.email in payload.People)]"> 
     <json:json-to-object-transformer returnClass="java.util.HashMap" /> 

    </enricher> 

Mvel проекции: http://mvel.codehaus.org/MVEL+2.0+Projections+and+Folds

+2

Вы также можете использовать простую Groovy Однострочник разобрать карту к списку писем: # [заводной: flowVars.myJsonMap.People.collect() {} it.Details.Email] –

+0

@Ryan - Спасибо за ваш ответ. Я ищу, чтобы извлечь все электронные письма, возможно, в одно действие. Я могу написать компонент java и сделать это, но мне было интересно, можно ли это сделать через MEL. –

+0

@ Антон - Спасибо за ваш комментарий. Я попробую ваш пример и посмотрю, будет ли это соответствовать моим потребностям. –

0

Если вы хотите получить конкретный электронная почта в деталях использует приведенное ниже выражение MEL.

#[json:People[0]/Details/Email] 

Если вы хотите, чтобы получить все письма, проходят JSon путь повторяемые в ForEach Collections затем пройти путь, чтобы получить Email, как показано ниже.

<flow name="parsingjsonFlow"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/> 
    <foreach collection="#[json:People]" doc:name="For Each"> 
     <logger message="#[json:/Details/Email]" level="INFO" doc:name="Logger"/> 
    </foreach> 
    <catch-exception-strategy doc:name="Catch Exception Strategy"> 
     <logger message="#[exception.getClass()]" level="INFO" doc:name="Logger"/> 
    </catch-exception-strategy> 
</flow> 
Смежные вопросы