mule esb中从JSON提取数组

mule esb中从JSON提取数组,mule,mule-studio,mule-el,Mule,Mule Studio,Mule El,我使用的是Mule 3.4 CE,我有一个JSON数据,通过HTTP以以下格式传输: { "People" : [ { "Details" : { "Name" : "John Smith", "Email" : "abc@mail.com" } }, { "Details" : { "Name" : "Tim Smith",

我使用的是Mule 3.4 CE,我有一个JSON数据,通过HTTP以以下格式传输:

{
   "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。

查询json的最佳方法是将其转换为地图

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

然后使用类似MEL的标准MVEL或Java语法查询它

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

如果希望保持原始json有效负载不变,可以使用enricher将映射存储在变量中:

<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以及如何处理地图、数组等:

注意:您可能会遇到一个#[json:]求值器,但这是不推荐的,因为它支持上述方法

更新:

如果您想一次抓取所有电子邮件,可以使用MVEL投影:

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

    </enricher>


Mvel投影:

如果您想获取详细信息中的特定电子邮件,请使用下面的MEL表达式

#[json:People[0]/Details/Email]
如果要获取所有电子邮件,请传递ForEach集合中repeatable的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>


您还可以使用简单的Groovy one liner将映射解析为电子邮件列表:#[Groovy:flowVars.myJsonMap.People.collect(){it.Details.Email}]“瑞安-谢谢你的回复。我想提取所有电子邮件,可能是一个活动。我可以写一个java组件,然后做它,但我想知道它是否可以通过MEL。@安东尼-谢谢你的评论。我会尝试你的例子,看看这是否符合我的需要。你也可以考虑使用流REF内丰富,和A S。ub flow用于json transformer,并使用Groovy方法设置有效负载,因此您的flowVar中只有电子邮件列表。Groovy evaluator也不赞成使用普通MEL。如果您想在go中提取所有电子邮件,可以使用MVEL fold:flowVars.emails=(email in payload.People)。更新了我的答案以显示完整示例。