当我有一个包含以下内容的sessionVars.filters时,如何针对JSON数据提取信息:
["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"
}
}
}
...从那以后,我希望能够返回以下有效负载(使用我的过滤器数组):
{
"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];
}
从那"伪代码"我或许可以创建我的最终响应有效负载:
{
"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& #34;],等等。
答案 0 :(得分:0)
您可以使用
<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>