Mule Server 3.6 > Anypoint Studio > 数据提取

Mule Server 3.6 > Anypoint Studio > Data Extraction

如何根据 JSON 数据提取信息,当我有 sessionVars.filters 包含:

["account", "billing"]

...我的 JSON 数据包含:

{
    "billing": {
        "BillNumber": 25,
        "BillPeriod": "06 Dec 14 - 05 Jan 15",
        "AccountNumber": 78781843,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": 1237.49,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": "1237.49"
    },
    "product": ["hilly"],
    "account": {
        "Name": "Lee G. Ive",
        "Address": "214 Maya St., G2 Village Highlands City, Somewhere 1630"
    },
    "content": {
        "package": {
            "userId": "1234"
        },
        "service": {
            "username": "hershey123"
        }
    }
}

...由此,我希望能够 return 以下有效负载(使用我的过滤器数组):

{
    "billing": {
        "BillNumber": 25,
        "BillPeriod": "06 Dec 14 - 05 Jan 15",
        "AccountNumber": 78781843,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": 1237.49,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": "1237.49"
    },
    "account": {
        "Name": "Lee G. Ive",
        "Address": "214 Maya St., G2 Village Highlands City, Somewhere 1630"
    }
}

编辑:附录

这就是我在 Anypoint Studio 中尝试做的事情:

response = {
    "result": {
        "code": 200,
        "status": "success"
    }
};
foreach (sessionVars.filters as filter) {
    response[filter] = data[filter];
}

据此 "pseudo-code" 我可以将我的最终响应负载创建为:

{
    "result": {
        "code": 200,
        "status": "success"
    },
    "billing": {
        "BillNumber": 25,
        "BillPeriod": "06 Dec 14 - 05 Jan 15",
        "AccountNumber": 78781843,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": 1237.49,
        "PreviousBalance": 0.00,
        "CurrentBalance": 1237.49,
        "DueDate": "Jan 26, 2015",
        "TotalAmountDue": "1237.49"
    },
    "account": {
        "Name": "Lee G. Ive",
        "Address": "214 Maya St., G2 Village Highlands City, Somewhere 1630"
    }
}

我忘了说 sessionVars.filters 数组是动态的,具体取决于可以包含 ["billing"] 或 ["product"、"account"] 的请求,或等等

你可以使用

<transformer ref="StringToObject" returnClass="java.util.HashMap"/>

有了地图后,只需访问钥匙即可。也许像

#[payload.billing]

#[payload.account]

基本上 JSON 路径在 Mule 中有一点限制,因此您宁愿将 JSON 转换为 HashMap 并使用 MEL 或以编程方式查询它们。

附录

下面是一个虚拟流程,它使用脚本转换器从有效负载中过滤掉不需要的字段,它本质上是您的逻辑的实现。

<flow name="soapwsFlow2">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/transformer" doc:name="8081/transformer"/>
        <set-payload value="#[['accounts':'lots of accountingJson','billing':'even more billing json','somethingelse':'lots of other stuff']]" doc:name="Set Payload"/>
        <set-session-variable variableName="filters" value="#[['accounts','billing']]" doc:name="Session Variable"/>
        <scripting:transformer returnClass="java.util.HashMap" doc:name="Groovy Transformer">
            <scripting:script engine="Groovy"><![CDATA[Map payloadData = payload
Map filteredData = new HashMap();
for(String filter : sessionVars.filters){
    filteredData.put(filter,payloadData[filter]);
}
return filteredData]]></scripting:script>
        </scripting:transformer>
        <json:object-to-json-transformer doc:name="Object to JSON"/>
        <logger message="FInal Payload #[payload]" level="INFO" doc:name="Logger"/>
    </flow>