从mule esb中的JSON中提取数组

时间:2014-02-05 21:57:55

标签: mule mule-studio mule-el

我正在使用Mule 3.4 CE,我有一个通过HTTP的JSON数据,格式如下:

{
   "People" : [
    {
       "Details" : 
       {
         "Name" : "John Smith",
         "Email" : "abc@mail.com"
       }
    },
    {
       "Details" : 
       {
         "Name" : "Tim Smith",
         "Email" : "def@mail.com"
       }
    },
    {
       "Details" : 
       {
         "Name" : "Ken Smith",
         "Email" : "ghi@mail.com"
       }
    },
}

我需要提取电子邮件并使用这些电子邮件查找Salesforce联系人,同时我想保留JSON有效负载。所以我的问题是如何通过MEL提取电子邮件? (例如“People / Details / * / Email”之类的内容 - 我知道这不是有效的,但我正在寻找正确的语法。

修改:我想一次性提取电子邮件而不是索引(例如人/详情[0]。电子邮件,可能使用MEL。

2 个答案:

答案 0 :(得分:14)

查询json的最佳方法是将其转换为Map。

<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备忘单详细说明了使用MEL的JSON处理以及如何处理地图,数组等:http://www.mulesoft.org/documentation/display/current/MEL+Cheat+Sheet

注意:您可能会遇到#[json:]评估者,但不赞成使用上述方法。

<强>更新

如果您想一次抓取所有电子邮件,可以使用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

答案 1 :(得分: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>