如何取回null
值,解組時,如果裏面的XML屬性值爲空?現在,我讓我的干將檢查null
內:JAXB返回null而不是空字符串
public String getLabel() {
if (label.isEmpty()) {
return null;
}
else {
return label;
}
}
但可能存在一些其他的,更優雅的方式?
謝謝。
如何取回null
值,解組時,如果裏面的XML屬性值爲空?現在,我讓我的干將檢查null
內:JAXB返回null而不是空字符串
public String getLabel() {
if (label.isEmpty()) {
return null;
}
else {
return label;
}
}
但可能存在一些其他的,更優雅的方式?
謝謝。
我想你的XML看起來或多或少是這樣的:
<myElement></myElement>
很不幸,意味着,你是傳遞一個空字符串。
如果你想通過null
你有兩個選擇:
<myElement/>
標籤的話)。使用xsi:nil
。如果使用xsi:nil
,首先你必須聲明你的XML元素(XSD文件)作爲nilable
,像這樣:然後
<xsd:element name="myElement" nillable="true"/>
,通過內部的XML的null
值做到這一點:
<myElement xsi:nil="true"/>
或本:
<myElement xsi:nil="true"></myElement>
這樣,JAXB知道,您通過null
而不是空字符串。
answer given by npe是一個不錯的選擇,並指定你想代表null
代表的方式也是我的建議。有xsi:nil
編組,你會想你的註釋財產(見Binding to JSON & XML - Handling Null):
@XmlElement(nillable=true)
public String getLabel() {
return label;
}
如果你不想改變你的XML表示,那麼你可以使用一個XmlAdapter
:
EmptyStringAdapter
package forum10869748;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class EmptyStringAdapter extends XmlAdapter<String, String> {
@Override
public String unmarshal(String v) throws Exception {
if("".equals(v)) {
return null;
}
return v;
}
@Override
public String marshal(String v) throws Exception {
return v;
}
}
富
您通過使用@XmlJavaTypeAdapter
註釋引用XmlAdapter
。如果您希望XmlAdapter
適用於所有字符串,那麼您可以在包級別註冊它(請參閱JAXB and Package Level XmlAdapters)。
package forum10869748;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Foo {
private String label;
@XmlJavaTypeAdapter(EmptyStringAdapter.class)
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
演示
package forum10869748;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum10869748/input.xml");
Foo foo = (Foo) unmarshaller.unmarshal(xml);
System.out.println(foo.getLabel());
}
}
input.xml中
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<label></label>
</foo>
輸出
null
相當有用的一段代碼 - 作爲你可以用'JAXB'完成的一個例子。但在我看來,你在這裏提出的是危險的。將空字符串作爲空值處理,而沒有任何合同中可能出現空值的通知('WSDL','XSD')是一種猴子補丁,而且幾乎可以肯定的是,某個人,有一天會真的非常沮喪地調試它。如果你想將空字符串和空值對待,我會建議使用commons-lang中的[isBlank(String)](http://commons.apache.org/lang/api-2.5/org/apache/commons/ lang/StringUtils.html#isBlank%28java.lang.String%29) – npe
@npe - 我同意指定'@XmlElement(nillable = true)'並在XML中明確表示空值是最好的選擇(我甚至可以使用upvoted你的答案)。我爲這些人添加了這個答案,不能更改XML表示。我認爲這並不危險,只要用戶符合空元素的含義即可。 –
爲什麼null會是更好的選擇?而不是檢查字符串是否爲空,在調用之後您必須執行以避免NPE,請檢查它是否爲空並且您已完成。 –