Me encontré con un comportamiento extraño en GSON.Lista de interfaces en serie GSON
Si tengo la siguiente estructura de clases:
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
};
}
que pueda hacer esto:
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Cat("Betty"));
animals.add(new Dog("Fred"));
System.out.println(gson.toJson(animals));
y obtener este resultado:
[{"name":"Betty"},{"name":"Fred"}]
Sin embargo, si pongo animals
en una clase contenedora:
public class Container {
List<Animal> animals = new ArrayList<Animal>();
public void addAnimal(Animal a){
animals.add(a);
}
}
y llame:
Container container = new Container();
container.addAnimal(new Cat("betty"));
System.out.println(gson.toJson(container));
me sale:
{"animals":[{}]}
Parece que GSON puede serializar una lista de una interfaz List<Interface>
cuando esa lista no es en sí mismo, pero cuando la lista está contenido en otra clase, GSON tiene problemas.
¿Alguna idea de lo que estoy haciendo mal?
Como nota al margen, puedo deserializar correctamente una cadena json en el tipo correcto utilizando un deserializador personalizado. Es la serialización que me está dando problemas.
Gracias
Siempre puede obtener el código fuente de Gson y ver lo que realmente están haciendo en ese método. –