Pages

Saturday, November 8, 2014

[WSO2 ESB] [4.8.1] How to Convert XML to JSON Array

Following API Demonstrate this functionality.

<api xmlns="http://ws.apache.org/ns/synapse" name="Transform" context="/Transform">
<resource methods="POST">
<inSequence>
<property name="messageType" value="application/json" scope="axis2"></property>
<log level="custom">
<property name="Status" expression="json-eval($.StockQuotes.Stock)"></property>
</log>
<filter source="json-eval($.StockQuotes.Stock.Symbol)" regex="null">
<then>
<payloadFactory media-type="json">
<format>{ "StockQuotes": { "Stock": $1 } }</format>
<args>
<arg evaluator="json" expression="$.StockQuotes.Stock"></arg>
</args>
</payloadFactory>
</then>
<else>
<payloadFactory media-type="json">
<format>{ "StockQuotes": { "Stock": [ $1 ] } }</format>
<args>
<arg evaluator="json" expression="$.StockQuotes.Stock"></arg>
</args>
</payloadFactory>
</else>
</filter>
<respond></respond>
</inSequence>
</resource>
</api>
view raw Transform.xml hosted with ❤ by GitHub
Try above api with a rest client with following sample requests.

1)Multiple Stocks.
XML request:
<StockQuotes>
<Stock>
<Symbol>IBM</Symbol>
<Last>0.00</Last>
<Date>N/A</Date>
<Time>N/A</Time>
<Change>N/A</Change>
<Open>N/A</Open>
<High>N/A</High>
<Low>N/A</Low>
<Volume>N/A</Volume>
<MktCap>N/A</MktCap>
<PreviousClose>N/A</PreviousClose>
<PercentageChange>N/A</PercentageChange>
<AnnRange>N/A - N/A</AnnRange>
<Earns>N/A</Earns>
<P-E>N/A</P-E>
<Name>IBM</Name>
</Stock>
<Stock>
<Symbol>WSO2</Symbol>
<Last>0.00</Last>
<Date>N/A</Date>
<Time>N/A</Time>
<Change>N/A</Change>
<Open>N/A</Open>
<High>N/A</High>
<Low>N/A</Low>
<Volume>N/A</Volume>
<MktCap>N/A</MktCap>
<PreviousClose>N/A</PreviousClose>
<PercentageChange>N/A</PercentageChange>
<AnnRange>N/A - N/A</AnnRange>
<Earns>N/A</Earns>
<P-E>N/A</P-E>
<Name>WSO2</Name>
</Stock>
</StockQuotes>
JSON response :
{
"StockQuotes":{
"Stock":[
{
"Name":"IBM",
"PercentageChange":"N\/A",
"Low":"N\/A",
"Open":"N\/A",
"Last":0.0,
"Time":"N\/A",
"MktCap":"N\/A",
"Change":"N\/A",
"Date":"N\/A",
"PreviousClose":"N\/A",
"Volume":"N\/A",
"Symbol":"IBM",
"AnnRange":"N\/A - N\/A",
"Earns":"N\/A",
"High":"N\/A",
"P-E":"N\/A"
},
{
"Name":"WSO2",
"PercentageChange":"N\/A",
"Low":"N\/A",
"Open":"N\/A",
"Last":0.0,
"Time":"N\/A",
"MktCap":"N\/A",
"Change":"N\/A",
"Date":"N\/A",
"PreviousClose":"N\/A",
"Volume":"N\/A",
"Symbol":"WSO2",
"AnnRange":"N\/A - N\/A",
"Earns":"N\/A",
"High":"N\/A",
"P-E":"N\/A"
}
]
}
}
2) Single Stock
XML request:
<StockQuotes>
<Stock>
<Symbol>WSO2</Symbol>
<Last>0.00</Last>
<Date>N/A</Date>
<Time>N/A</Time>
<Change>N/A</Change>
<Open>N/A</Open>
<High>N/A</High>
<Low>N/A</Low>
<Volume>N/A</Volume>
<MktCap>N/A</MktCap>
<PreviousClose>N/A</PreviousClose>
<PercentageChange>N/A</PercentageChange>
<AnnRange>N/A - N/A</AnnRange>
<Earns>N/A</Earns>
<P-E>N/A</P-E>
<Name>WSO2</Name>
</Stock>
</StockQuotes>
JSON response (As an array):
{
"StockQuotes":{
"Stock":[
{
"Name":"WSO2",
"PercentageChange":"N\/A",
"Low":"N\/A",
"Open":"N\/A",
"Last":0.0,
"Time":"N\/A",
"MktCap":"N\/A",
"Change":"N\/A",
"Date":"N\/A",
"PreviousClose":"N\/A",
"Volume":"N\/A",
"Symbol":"WSO2",
"AnnRange":"N\/A - N\/A",
"Earns":"N\/A",
"High":"N\/A",
"P-E":"N\/A"
}
]
}
}
This is with following message formatter and builder
        <messageformatter class="org.apache.synapse.commons.json.JsonStreamFormatter" contenttype="application/json" />

        <messageformatter class="org.apache.synapse.commons.json.JsonStreamFormatter" contenttype="application/json" />

No comments:

Post a Comment