骆驼路线:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<dataFormats>
<xmljson id="xmljson" />
</dataFormats>
<route id="route1">
<from uri="file:C:/Users/User1/InputXML"/>
<to uri="activemq:queue:MyThread1"/>
</route>
<route id="route2">
<from uri="activemq:queue:MyThread1"/>
<marshal ref="xmljson"/>
<bean ref="com.test.OutputProcessor"/>
</route>
</camelContext>
输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<to> Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</Message>
实际输出:
{"to":" Tove","from":"Jani","heading":"Reminder","body":"Don't forget me this weekend!"}
我想自定义此输出。我想为转换后的json添加一些mote属性。例如,我希望输出json为
{
"inputs":[
{
"inputname":"to",
"inputValue":"Tove"
},
{
"inputname":"from",
"inputValue":"jani"
},
{
"inputname":"heading",
"inputValue":"Reminder"
},
{
"inputname":"body",
"inputValue":"Don't forget me this weekend!"
}
]
}
如何实现这一目标?
答案 0 :(得分:1)
我认为AggregationStrategy
可能有所帮助:
1)首先将aggregationStrategy添加到您的路线中:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<enrich strategyRef="aggregationStrategy">
<constant>direct:resource</constant>
<to uri="direct:result"/>
</route>
<route>
<from uri="direct:resource"/>
...
</route>
</camelContext>
<bean id="aggregationStrategy" class="com.ExampleAggregationStrategy" />
2)然后创建将获得消息正文的类并按您希望的方式对其进行转换,并再次将正文设置为Exchange。
OBS:此处您需要使用 xml
API 添加要添加的属性。
public class ExampleAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange original, Exchange resource) {
Object originalBody = original.getIn().getBody();
Object resourceResponse = resource.getIn().getBody();
Object mergeResult = ... // combine original body and resource response
if (original.getPattern().isOutCapable()) {
original.getOut().setBody(mergeResult);
} else {
original.getIn().setBody(mergeResult);
}
return original;
}
}
更多here。
答案 1 :(得分:0)
是否有任何阻止您使用XSLT组件的内容?您可以应用它来将输入XML转换为直接映射到所需输出JSON格式的格式,然后将其推送到xmljson,例如 - (需要一些清理以避免一些空白元素)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Message">
<inputs>
<xsl:for-each select="*">
<inputname><xsl:value-of select="name()" /> </inputname>
<inputvalue><xsl:value-of select="." /></inputvalue>
</xsl:for-each>
</inputs>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
使用杰克逊图书馆。您可以以编程方式更改输出格式。 Unmarshal仅适用于直接映射而非富集。基本上解组为xml,添加处理器,然后创建输出Json格式。