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>
如何根据 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>