Apache Camel xmljson中的自定义JSON输出

时间:2015-06-24 10:13:52

标签: json xml xml-parsing apache-camel

骆驼路线:

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

如何实现这一目标?

3 个答案:

答案 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格式。