2015-06-24 15 views
8

Camel Route:tùy chỉnh JSON đầu ra trong 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> 

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

thực tế đầu ra:

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

Tôi muốn tùy chỉnh đầu ra này. tôi muốn thêm một số thuộc tính mote vào json được chuyển đổi. Ví dụ tôi muốn json đầu ra là

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

Làm cách nào để đạt được điều này?

+0

Xem nội dung phong phú hơn và EIP dịch thông điệp trong Apache Camel. – Namphibian

+0

Về cơ bản, bạn có yêu cầu cách chuyển đổi nhiều chuỗi thành một đoạn JSON duy nhất (được giữ trong một biến) theo định dạng bạn đã hiển thị, mỗi chuỗi bao gồm một nhóm 4 cặp dữ liệu không? Hoặc có thể có nhiều hơn 4 cặp dữ liệu, ví dụ như giá trị 'CC'? – Mousey

+0

Có thể có nhiều cặp hơn. Những gì tôi thực sự muốn là thêm các thuộc tính tùy chỉnh, như "inputname" hoặc "inputtype" trong JSon, mà không phải là một phần của XML. – KmrGtm

Trả lời

0

Tôi nghĩ rằng một AggregationStrategy có thể giúp:

1) Fist bạn thêm aggregationStrategy để định tuyến của bạn:

<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) Sau đó tạo lớp mà sẽ nhận được Body của thông điệp và chuyển đổi nó theo cách bạn muốn, và thiết lập lại cơ thể cho Exchange. OBS: Tại đây Bạn cần phải sử dụng xml API để thêm thuộc tính bạn muốn thêm.

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

} 

Thêm here.

+0

Cảm ơn .. Hãy thử và cho bạn biết .. – KmrGtm

0

Có điều gì ngăn bạn sử dụng thành phần XSLT không? Bạn có thể áp dụng điều đó để đưa XML đầu vào sang định dạng trực tiếp ánh xạ tới định dạng JSON đầu ra mong muốn của bạn và sau đó đẩy nó vào xmljson ví dụ: - (cần dọn sạch một số để tránh một số phần tử trống)

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

Không có gì ngăn cản .. XSLT đang hoạt động như đá quý. tôi đã sử dụng xsl từ vài tháng trước. Bây giờ tôi muốn sử dụng tính năng lạc đà này. – KmrGtm

+0

Để hiểu biết tốt nhất của tôi, thành phần xmljson sẽ không cung cấp cho bạn nhiều quyền kiểm soát để chuyển đổi/thay đổi loại đối tượng JSON được tạo ra. Bạn cần cung cấp cho nó XML gần với JSON bạn muốn - cho rằng bạn nên sử dụng thành phần XSLT của Camel. – ssaptarshi

0

Sử dụng thư viện Jackson. Bạn có thể thay đổi định dạng đầu ra theo chương trình. Unmarshal chỉ tốt cho lập bản đồ trực tiếp và không làm giàu. Về cơ bản Unmarshal để xml, thêm một bộ xử lý và sau đó tạo ra định dạng Json đầu ra của bạn.

Các vấn đề liên quan