[英]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
的類上)來匹配名稱空間限定。
嘗試在結尾的有效負載標簽上添加一個/。
</Payload>
而不是<Payload>
@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.