我使用JAXB将java应用程序的对象保存为XML文件。但是我遇到的问题是,当空值在数组数组中时,JAXB会在XML中将对象替换为Java中的对象。使用一个简单的数组,空值被编组并再次作为空值解组,没有问题。
我在动物园中的任何一个人做了一个例子,动物是一组数组。
动物类:
<div id="chart" style="position: relative; width: 600px; height: 200px; bottom: 0px; padding-bottom: 200px; "></div>
动物由课程扩展&#34; Dog&#34;和&#34; Cat&#34;。两者都有额外的价值(最喜欢的食物为猫和最喜欢的狗狗)。
@XmlSeeAlso({Dog.class,Cat.class})
public class Animal {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是我的动物园,里面有动物阵列:
@XmlRootElement
public class Dog extends Animal {
private String favoriteFood = null;
public String getFavoriteFood() {
return favoriteFood;
}
public void setFavoriteFood(String favoriteFood) {
this.favoriteFood = favoriteFood;
}
}
@XmlRootElement
public class Cat extends Animal {
private String favoritToy = null;
public String getFavoritToy() {
return favoritToy;
}
public void setFavoritToy(String favoritToy) {
this.favoritToy = favoritToy;
}
}
这是我的测试类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Zoo {
private Animal[][] animals = null;
private String name = null;
public Animal[][] getAnimals() {
return animals;
}
public void setAnimals(Animal[][] animals) {
this.animals = animals;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void showNulls(){
for(int i = 0; i<this.animals.length; i++){
Animal[] row = this.animals[i];
for(int j = 0; j<row.length; j++){
if(row[j] == null){
System.out.println("Value at "+i+"/"+j+" is null");
}
}
}
}
}
第一个xml看起来像预期的Null值:
public class Main {
public static void main(String[] args) {
Zoo myZoo = new Zoo();
myZoo.setName("MyZoo");
Cat myCat = new Cat();
myCat.setName("Susi");
myCat.setFavoritToy("Ball");
Dog myDog = new Dog();
myDog.setName("Brutus");
myDog.setFavoriteFood("Meat");
Animal[][] animals = new Animal[1][3];
animals[0][0] = myCat;
animals[0][1] = null;
animals[0][2] = myDog;
myZoo.setAnimals(animals);
myZoo.showNulls();
System.out.println("------------------------------");
File zooFile = new File("Zoo.xml");
JAXB.marshal(myZoo, zooFile);
System.out.println("Saved Zoo");
System.out.println("------------------------------");
System.out.println("Loaded Zoo");
Zoo loadedZoo = JAXB.unmarshal(zooFile, Zoo.class);
loadedZoo.showNulls();
File zooFile2 = new File("Zoo2.xml");
JAXB.marshal(loadedZoo, zooFile2);
System.out.println("Saved Zoo2");
}
}
但是在解组之后,输出显示,不再有Null值:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<animals>
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="cat">
<name>Susi</name>
<favoritToy>Ball</favoritToy>
</item>
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="dog">
<name>Brutus</name>
<favoriteFood>Meat</favoriteFood>
</item>
</animals>
<name>MyZoo</name>
</zoo>
新的xml现在有一个Animal元素,其中null值为:
Value at 0/1 is null
------------------------------
Saved Zoo
------------------------------
Loaded Zoo
Saved Zoo2
另外,如果我将Animal类抽象化,则会出现错误,因为JAXB无法为null值创建Animal。
我发现以某种方式工作的唯一方法是使用XMLAdapter,它使用带有行对象数组的附加类。然后行对象包含动物。但这非常麻烦。 我认为必须有一种更简单的方法来将xml-null值解组为对象中的空值。特别是,因为它适用于一维数组。
如果有人知道更好的方法,我怎么能实现JAXB在解组时保持空值,那就太好了。