簡體   English   中英

JAXB解組對象列表

[英]JAXB Unmarshal a list of objects

我要嘗試解封以下XML:

<ListOfYear>
    <Requests/>
    <Payload>
        <Year>
            <Value>2013</Value>
        </Year>
        <Year>
            <Value>2012</Value>
        </Year>
        <Year>
            <Value>2011</Value>
        </Year>
        <Year>
            <Value>2010</Value>
        </Year>
        <Year>
            <Value>2009</Value>
        </Year>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ListOfYear>

我的java類看起來像這樣:

@XmlRootElement(name = "ListOfYear")
public class YearOutput {

    @XmlElementWrapper(name = "Payload")
    @XmlElement(name = "Year")
    private ArrayList<Year> Payload;

    public ArrayList<Year> getPayload() {
        return Payload;
    }

    public void setPayload(ArrayList<Year> payload) {
        Payload = payload;
    }
}

有效負載應包含年份對象列表:

@XmlRootElement(name = "Year")
@XmlAccessorType(XmlAccessType.FIELD).
public class Year {

    @XmlElement(name = "Value")
    int Value;

    public int getValue() {
        return Value;
    }

    public void setValue(int value) {
        Value = value;
    }
}

我用以下代碼解組XML:

String r = response.getEntity(String.class);
JAXBContext jaxbContext = JAXBContext.newInstance(YearOutput.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

YearOutput output = (YearOutput) unmarshaller.unmarshal(new StringReader(r));

我得到一個很好的輸出對象,有效載荷對象始終為null。 我已經用XML注釋嘗試了幾種不同的方法,但沒有任何東西可以工作。 任何幫助將非常感激。

編輯我以為命名空間是無關緊要的,所以我沒有發布代碼的那部分。 但是@Blaise Doughan建議我將模型編組,看來我的命名空間可能會引起問題...

這是我需要的完整XML:

<ListOfYear xmlns="http://something.com/">
    <Requests/>
    <Payload>
        <Year>
            <Value>2013</Value>
        </Year>
        <Year>
            <Value>2012</Value>
        </Year>
        <Year>
            <Value>2011</Value>
        </Year>
        <Year>
            <Value>2010</Value>
        </Year>
        <Year>
            <Value>2009</Value>
        </Year>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ListOfYear>

這是我的完整模型:

@XmlRootElement(name = "ListOfYear", namespace = "http://something.com/")
public class YearOutput {

    @XmlElementWrapper(name = "Payload")
    @XmlElement(name = "Year")
    private ArrayList<Year> Payload;

    public ArrayList<Year> getPayload() {
        return Payload;
    }

    public void setPayload(ArrayList<Year> payload) {
        Payload = payload;
    }
}

現在,當我編組模型時,我得到:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:ListOfYear xmlns:ns2="https://something.com/">
    <Payload>
        <Year>
            <Value>2008</Value>
        </Year>
    </Payload>
</ns2:ListOfYear>

那么我的名稱空間在做什么呢?

編輯添加package-info.java后,一切正常!

@XmlSchema(
        namespace = "https://something.com/",
        elementFormDefault = XmlNsForm.QUALIFIED)
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

您的注釋需要放在屬性(get或set方法)上而不是字段上。 如果希望在字段(實例變量)上使用它們,則需要使用@XmlAccessorType(XmlAccessType.FIELD)來對類進行注釋,就像在Year類中一樣。

更新

代替在@XmlRootElement上指定名稱空間,您將需要利用程序包級別的@XmlSchema批注(在名為package-info的類上)來匹配名稱空間限定。

嘗試在結尾的有效負載標簽上添加一個/。

  1. 已經提到過,XML文件的最后一行應該包含</Payload>而不是<Payload>
  2. @XmlElement應該在屬性之上,但不能在Year類中獲取:
    @XmlElement int Value;

getValue的XmlElement批注中的元素名稱丟失。 JAXB的默認行為是getValue表示'value'元素, 而不是'Value' 添加注釋@XmlElement(name =“ Value”)

像其他代碼一樣修復它

@XmlRootElement(name = "Year")
public static Year {

...

    @XmlElement(name="Value")
    public int getValue() {
       return Value;
   }

...

}

如果您還編組,建議將@XmlAccessorType(XmlAccessType.NONE)添加到類中,以防止同時添加“值”和“值”元素。

請參閱https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-1.4/browse/上的 “ wicketstuff / enteam / wicket / examples14 / mixed”包中的完整工作代碼。

此外,“ YearOutputTest”中還提供了一個測試,該測試可登錄到控制台並解析回XML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM