mule esb中从JSON提取数组
我使用的是Mule 3.4 CE,我有一个JSON数据,通过HTTP以以下格式传输: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",
{
"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)。更新了我的答案以显示完整示例。