4

當使用Jackson序列化爲XML時,我似乎遇到了問題。我的代碼如下:將ArrayList中的對象序列化爲XML時丟失類型元素

測試容器

package com.test; 

import java.util.ArrayList; 

import com.fasterxml.jackson.annotation.JsonProperty; 

public class TestContainer { 

    private String testContainerID; 
    private String testContainerMessage; 
    private ArrayList<TestChild> testContainerChildren; 

    @JsonProperty("TestContainerID") 
    public String getTestContainerID() { 
     return testContainerID; 
    } 

    @JsonProperty("TestContainerID") 
    public void setTestContainerID(String testContainerID) { 
     this.testContainerID = testContainerID; 
    } 

    @JsonProperty("TestContainerMessage") 
    public String getTestContainerMessage() { 
     return testContainerMessage; 
    } 

    @JsonProperty("TestContainerMessage") 
    public void setTestContainerMessage(String testContainerMessage) { 
     this.testContainerMessage = testContainerMessage; 
    } 

    @JsonProperty("TestContainerChildren") 
    public ArrayList<TestChild> getTestContainerChildren() { 
     return testContainerChildren; 
    } 

    @JsonProperty("TestContainerChildren") 
    public void setTestContainerChildren(ArrayList<TestChild> testContainerChildren) { 
     this.testContainerChildren = testContainerChildren; 
    } 

} 

TESTCHILD

package com.test; 

import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonRootName; 

@JsonRootName(value="TestChild") 
public class TestChild { 

    private String testChildID; 
    private String testChildMessage; 

    @JsonProperty("TestChildID") 
    public String getTestChildID() { 
     return testChildID; 
    } 

    @JsonProperty("TestChildID") 
    public void setTestChildID(String testChildID) { 
     this.testChildID = testChildID; 
    } 

    @JsonProperty("TestChildMessage") 
    public String getTestChildMessage() { 
     return testChildMessage; 
    } 

    @JsonProperty("TestChildMessage") 
    public void setTestChildMessage(String testChildMessage) { 
     this.testChildMessage = testChildMessage; 
    } 

} 

使用

  • Serializatio n:

    XmlMapper xm = new XmlMapper();TestContainer tc = xm.readValue(sb.toString(),TestContainer.class);

  • 反序列化:

    的System.out.println(xm.writeValueAsString(TC)); tc = xm.readValue(sb.toString(),TestContainer.class);

我在做的是從classpath中的一個文件夾中加載一個XML文件,並將該文件的內容放入一個StringBuffer中。問題是爲對象集合生成的XML。當寫的XML,我想是這樣的:

<TestContainerChildren><TestChild><...(Element Details)...></TestChild></TestContainerChildren> 

,但我發現:

<TestContainerChildren><TestContainerChildren><...(Element Details)...><TestContainerChildren></TestContainerChildren> 

我不知道我錯過,在這裏。我對序列化/反序列化的JSON部分沒有問題,只有XML。我同時使用Jackson和JAXB註釋關閉包裝試過,我已經使用了以下注釋嘗試:

  • @JsonRootName
  • @JsonProperty
  • @JacksonXmlElementWrapper
  • @JacksonElement
  • @ XmlElementWrapper
  • @XmlElement

我很肯定這是我的愚蠢,但任何幫助將是最感激。

+0

我不明白的是如何所有的屬性序列化罰款。這只是未被序列化的子元素的類名稱。我曾認爲Java Type Erasure可能是問題,但如果處理器找不到類型,我認爲它不能讀取XML字符串,因爲它不能實例化TestChild類。 – Prmths

+0

鏈接到SSCCE:https://www.sugarsync.com/pf/D7626132_721_921097897 – Prmths

+0

更新:試圖按以下問題的指示後 http://stackoverflow.com/questions/2525042/how-to-convert -a-json-string-to-a-mapstring-string-with-jackson-json http://stackoverflow.com/questions/6846244/jackson-and-generic-type-reference http://stackoverflow.com/questions/9829403/deserialize-json-to-arraylistpojo-using-jackson http://stackoverflow.com/questions/15430715/casting-linkedhashmap-to-complex-object 我還沒有找到解決方案。我在考慮一個自定義序列化器,但我不知道這是我需要的。 – Prmths

回答

3

我通過使用可變聲明之上以下注釋本工作:

  • @JacksonXmlElementWrapper(的localName = 「[插入集合名稱]」)
  • @JacksonXmlProperty(的localName =「[插入收集元件名稱]「)

這是一個簡單的RTFM案例,因爲它記錄爲here

2

好的,幾個筆記。首先,@JsonRootName隻影響用於XML文檔根目錄的名稱,如名稱所示。所以它不用於TestChild。其次,這聽起來像是你想爲列表使用所謂的「unwrapped」輸出,省略了包含List元素的屬性的元素。這是可行的搭配:

@JacksonXmlElementWrapper(useWrapping=false) 
@JsonProperty("TestContainerChildren") 
public ArrayList<TestChild> getTestContainerChildren() { ... } 

,因爲默認設置是使用包裝(這是從JAXB,其中解開是默認的不同)。或者,如果你想在全球範圍內改變這個假設展開爲默認值,您可以通過XmlModule更改默認值:

JacksonXmlModule module = new JacksonXmlModule(); 
// to default to using "unwrapped" Lists: 
module.setDefaultUseWrapper(false); 
XmlMapper xmlMapper = new XmlMapper(module); 

希望這有助於!

+0

感謝您的回覆。我刪除了註釋@JsonRootName,你就對了。我確實想保留容器元素。我正在處理類似於您在XML [這裏](http://wiki.open311.org/Service_Discovery)中看到的內容。你在這裏看到,元素「端點」和「格式」都包含在它們各自的元素中。 – Prmths