2015-06-24 23 views
8

骆驼路线:在Apache的骆驼自定义JSON输出xmljson

<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!"} 

我想自定义此输出。我想添加一些mote属性到转换后的json。例如,我希望输出json为

{ 
    "inputs":[ 
       { 
      "inputname":"to", 
      "inputValue":"Tove" 
      }, 
      { 
      "inputname":"from", 
      "inputValue":"jani" 
      }, 
      { 
      "inputname":"heading", 
      "inputValue":"Reminder" 
      }, 
      { 
      "inputname":"body", 
      "inputValue":"Don't forget me this weekend!" 
      } 
     ] 
    } 

这是如何实现的?

+0

查看Apache Camel中的内容更丰富和消息转换器EIP。 – Namphibian

+0

您是否基本问过如何将多个字符串转换为您显示的格式的单个JSON块(保存在变量中),每个块都由一组4对数据组成? 或者可能有超过4对的数据,例如'CC'值? – Mousey

+0

可能有更多对。我真正想要的是在JSon中添加自定义属性,如“inputname”或“inputtype”,这些属性不是XML的一部分。 – KmrGtm

回答

0

我觉得一个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

+0

谢谢..我们试试看,让你知道.. – KmrGtm

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> 
+0

没有什么阻止.. XSLT像宝石一样工作。我过去几个月一直在使用xsl。现在我想使用这个骆驼功能。 – KmrGtm

+0

据我所知,xmljson组件不会给你太多的控制权来转换/更改生成的JSON对象的种类。您需要为它提供接近您所需JSON的XML - 因为您应该使用Camel的XSLT组件。 – ssaptarshi

0

使用Jackson库。您可以通过编程方式更改输出格式。解组仅适用于直接映射而不是充实。基本上Unmarshal xml,添加一个处理器,然后创建您的输出Json格式。