Skip to content

Instantly share code, notes, and snippets.

@dinigo
Last active December 10, 2015 12:08
Show Gist options
  • Select an option

  • Save dinigo/4431586 to your computer and use it in GitHub Desktop.

Select an option

Save dinigo/4431586 to your computer and use it in GitHub Desktop.
Deserializing JSON polimorfic clases with gson
public interface Articulo {
enum TipoArticulo {ENTREVISTA, BANNER};
}
class ArticuloAdapter implements JsonDeserializer<Articulo> {
@Override
public Articulo deserialize(JsonElement jsonElement, Type tipo, JsonDeserializationContext context) throws JsonParseException {
JsonObject object = jsonElement.getAsJsonObject();
Gson gson = new Gson();
JsonElement titular = object.get("titular");
if (titular != null) {
return gson.fromJson(jsonElement, ArticuloTexto.class);
}
JsonElement banner = object.get("banner");
if (banner != null) {
return gson.fromJson(jsonElement, ArticuloBanner.class);
}
return null;
}
}
class ArticuloBanner implements Articulo
{
private static final TipoArticulo tipo = TipoArticulo.BANNER;
private String banner;
public ArticuloBanner(String dirImagen) {
this.banner = dirImagen;
}
}
class ArticuloTexto implements Articulo
{
private static final TipoArticulo tipo = TipoArticulo.ENTREVISTA;
private String titular;
private String autor;
public ArticuloTexto(String titular, String autor, List<Elemento> articulos) {
this.titular = titular;
this.autor = autor;
this.articulos = articulos;
}
private List<Elemento> articulos;
}
public static void constructorRevistaPolimorfico(String revista) throws JsonSyntaxException, JsonIOException, FileNotFoundException{
Gson gson = new GsonBuilder().
setPrettyPrinting().
registerTypeHierarchyAdapter(Articulo.class, new ArticuloAdapter()).
create();
ArrayList<Articulo> revistar = gson.fromJson(revista, new TypeToken<List<Articulo>>(){}.getType());
System.out.println(gson.toJson(revistar));
}
class Elemento
{
private String tipo;
private String contenido;
public Elemento(String tipo, String contenido) {
this.tipo = tipo;
this.contenido = contenido;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment