2015-06-24 49 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格式。