JAXB将Null元素解组为对象数组数组中的对象

时间:2016-12-05 14:08:39

标签: java arrays xml jaxb unmarshalling

我使用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在解组时保持空值,那就太好了。

0 个答案:

没有答案