Я столкнулся с каким-то странным поведением в GSON.
Если у меня есть следующая структура класса:
public interface Animal {
public void nothing();
}
public class Cat implements Animal {
private String name;
public Cat(String name) {
super();
this.name = name;
}
public Cat(){}
@Override
public void nothing() {
// TODO Auto-generated method stub
};
}
public class Dog implements Animal {
private String name;
public Dog(String name) {
super();
this.name = name;
}
public Dog(){}
@Override
public void nothing() {
// TODO Auto-generated method stub
};
}
Я могу это сделать:
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat("Betty"));
animals.add(new Dog("Fred"));
System.out.println(gson.toJson(animals));
и получить этот вывод:
[{"name":"Betty"},{"name":"Fred"}]
Однако, если я помещаю animals
в содержащий класс:
public class Container {
List<Animal> animals = new ArrayList<Animal>();
public void addAnimal(Animal a){
animals.add(a);
}
}
и вызовите:
Container container = new Container();
container.addAnimal(new Cat("betty"));
System.out.println(gson.toJson(container));
Я получаю:
{"animals":[{}]}
Похоже, что GSON может сериализовать список интерфейса List<Interface>
, когда этот список сам по себе, но когда список содержится в другом классе, у GSON есть проблемы.
Любая идея, что я делаю неправильно?
Как замечание, я могу правильно десериализовать строку json в правильный тип, используя собственный десериализатор. Это сериализация, которая дает мне проблемы.
Спасибо