2014-02-05 27 views
2

我用騾子3.4 CE和我有一個JSON數據通過HTTP以以下格式來:在騾子ESB從JSON中提取陣列

{ 
    "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提取電子郵件? (例如「People/Details/*/Email」這樣的東西 - 我知道這不是有效的,但是我正在尋找正確的語法。而不是索引(對於如人/詳細信息[0] .Email,可能使用MEL。查詢JSON

回答

14

有最好的方式是把它轉化爲一個地圖。

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

你也可以使用Jackson將json映射到自定義類,並將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] 

如果你想獲得的所有電子郵件,傳中的ForEach集合重複JSON的路徑,然後傳遞給我們的房源,如下圖所示的路徑。

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