2012-10-15 31 views
2

我使用傑克遜1.9.2與XML dataformat module。我需要調整傑克遜序列化數組,列表和集合的方式。傑克遜XML全球集裝箱類型的元素名稱

默認情況下,一個int數組屬性稱爲myProperty包含了幾個數字,傑克遜/ XML是生產以下:

<myProperty> 
    <myProperty>1</myProperty> 
    <myProperty>2</myProperty> 
</myProperty> 

我需要產生的是:

<myProperty> 
    <item>1</item> 
    <item>2</item> 
</myProperty> 

我可以使用JacksonXmlElementWrapperJacksonXmlProperty這樣的組合來執行此操作,如下所示:

@JacksonXmlElementWrapper(localname='myProperty') 
@JacksonXmlProperty(localname='item') 
public int[] myProperty; 

但是,該解決方案需要我手動將這些註釋應用於我的POJO中的每個數組,列表和集合。一個更好的解決方案將允許我在全局範圍內爲所有數組,列表,集合類型應用一次解決方案。有關如何實施此類解決方案的任何想法?

謝謝!

回答

1

您可以使用XML模塊提供的子類AnnotationIntrospector,並覆蓋檢查@JacksonXmlElementWrapper的方法,並使其返回所需的任何包裝器名稱。

+0

我喜歡這種方法。任何線索我怎麼可能爲'@JacksonXmlProperty(localName ='item')'做同樣的事情? – maxenglander

+0

是的,那個註解也是通過'AnnotationIntrospector'處理的,所以你可以重寫它。 – StaxMan

+0

對不起,我看到它可以用'findSerializablePropertyName'完成,但是我不能簡單地從該方法返回''item「':當上下文在一個範圍內時,我需要有選擇地返回''item''非映射容器類型(列表,數組或集合)。以這種方式調整'findSerializablePropertyName'是我不知道該怎麼做的。 – maxenglander

0

我最終創建了自己的JsonGenerator,爲我的團隊需要支持的傳統格式生成XML。

我希望使用Jackson XML數據格式模塊,它提供更多的安全性,更多的測試,並且可能更快。不幸的是,我無法使用StaxMan的建議找到解決方案。

+0

這是不幸的,但可以理解。還有一點建議:如果你是通過數據綁定,你還必須使用原始的Stax(XML)api(參見'javax.xml.stream.XMLStreamWriter')。使用內容生成相對簡單,高效(如果您需要多個編寫器,請記住重用'XMLOutputFactory')。 – StaxMan

+0

感謝您的建議。爲什麼有必要使用?在我的'JsonGeneratorBase'子類中,我只是將'String'寫入流中。 – maxenglander

+1

我強烈勸阻任何人使用字符串書寫編寫XML - 這不會處理「有趣的字符」的轉義。 XMLStreamWriter通常也比String串聯更快。 – StaxMan