2015-06-24 3 views
8

Camel Route:Benutzerdefinierte JSON Ausgabe in Apache Camel 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-Input-:

<?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> 

tatsächlichen Ausgang:

{"to":" Tove","from":"Jani","heading":"Reminder","body":"Don't forget me this weekend!"} 

Ich mag diese Ausgabe anpassen. ich möchte dem konvertierten json einige mote-attribute hinzufügen. Zum Beispiel möchte ich den Ausgang json als

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

Wie dies erreicht werden kann?

+0

Betrachten Sie Inhalt en-reicher und Nachricht Übersetzer EIP in Apache Camel. – Namphibian

+0

Fragen Sie im Grunde, wie Sie mehrere Strings in einen einzelnen JSON-Block (in einer Variablen) in dem von Ihnen gezeigten Format konvertieren, wobei jedes aus einer Gruppe von 4 Datenpaaren besteht? Oder könnte es mehr als 4 Datenpaare geben, zB 'CC' Wert? – Mousey

+0

Es könnte mehr Paare geben. Eigentlich möchte ich benutzerdefinierte Attribute wie "inputname" oder "inputtype" in JSon hinzufügen, die nicht Teil von XML sind. – KmrGtm

Antwort

0

Ich denke, ein AggregationStrategy helfen könnten:

1) Faust Sie die aggregationStrategy zu Ihrer Route hinzufügen:

<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) dann die Klasse, die die Körper der Nachricht erhalten und wandeln Sie es so um, wie Sie möchten, und stellen Sie den Körper erneut auf Exchange ein. OBS: Hier müssen Sie ein xml API verwenden, um die Attribute hinzuzufügen, die Sie hinzufügen möchten.

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; 
    } 

} 

Mehr here.

+0

Danke .. WILL es versuchen und lassen Sie es wissen .. – KmrGtm

0

Gibt es Probleme, die die Verwendung einer XSLT-Komponente verhindern? Sie können dies anwenden, um die Eingabe-XML in ein Format zu bringen, das direkt dem gewünschten Ausgabe-JSON-Format entspricht, und es dann an xmljson, z. - (Sie müssen etwas sauber gemacht werden, um einige leere Elemente zu vermeiden)

<?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

Nichts zu verhindern .. XSLT funktioniert wie Edelstein. Ich benutze xsl von den letzten paar Monaten. Jetzt möchte ich dieses Kamel-Feature verwenden. – KmrGtm

+0

Soweit ich weiß, wird Ihnen die xmljson-Komponente nicht viel Kontrolle geben, um die Art der JSON-Objekte zu transformieren/ändern. Sie müssen es mit XML füttern, das nahe an JSON ist, das Sie wollen - dafür sollten Sie die XSLT-Komponente von Camel verwenden. – ssaptarshi

0

Verwenden Sie die Jackson-Bibliothek. Sie können das Ausgabeformat programmgesteuert ändern. Unmarshal eignet sich nur für direkte Kartierung und nicht für Bereicherung. Im Wesentlichen Unmarshal to XML, fügen Sie einen Prozessor hinzu und erstellen Sie dann das Ausgabe-Json-Format.