Mule Server 3.6> Anypoint Studio>数据提取

时间:2015-06-13 07:24:24

标签: json mule esb mule-studio

当我有一个包含以下内容的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;],等等。

1 个答案:

答案 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>