2

我正在使用 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”之类的东西 - 我知道这不是有效的,但我正在寻找正确的语法。

编辑:我想一次性提取电子邮件而不是索引(例如 People/Details[0].Email,可能使用 MEL。

4

2 回答 2

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

于 2014-02-05T22:42:22.977 回答
0

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

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

如果要获取所有邮件,请在 ForEach Collections 中传递可重复的 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>
于 2017-08-10T12:50:44.933 回答