GSON sembra che stia facendo una specie di trucco dove guarda i campi interni dei miei JavaBeans invece di usare le informazioni di proprietà accessibili pubblicamente. Sfortunatamente questo non volerà per noi perché i nostri fagioli magicamente creati sono pieni di campi privati che non voglio che vengano archiviati.GSON non chiama il mio TypeAdapter per un tipo che è un'interfaccia
@Test
public void testJson() throws Exception
{
Player player = new MagicPlayer(); //BeanUtils.createDefault(Player.class);
player.setName("Alice");
Gson gson = new GsonBuilder()
.registerTypeAdapter(Player.class, new PlayerTypeAdapter())
.create();
System.out.println(gson.toJson(bean));
}
private static class PlayerTypeAdapter implements JsonSerializer<Player>
{
@Override
public JsonElement serialize(Player player, Type type,
JsonSerializationContext context)
{
throw new RuntimeException("I got called, woohoo");
}
}
public static interface Player //extends SupportsPropertyChanges
{
public String getName();
public void setName(String name);
}
// Simple implementation simulating what we're doing.
public static class MagicPlayer implements Player
{
private final String privateStuff = "secret";
private String name;
@Override
public String getName()
{
return name;
}
@Override
public void setName(String name)
{
this.name = name;
}
}
Questo dà:
{"privateStuff":"secret","name":"Alice"}
E, naturalmente, non chiama mai il mio adattatore tipo, che rende apparentemente impossibile ottenere qualsiasi altro comportamento.
Could aggiungi il codice che chiama Gson.toJson()? –
Non è chiaro che questo sia lo stesso problema, ma mi sono imbattuto in qualcosa di simile qualche tempo fa, forse ti aiuterà: http://stackoverflow.com/questions/5952595/serializing-list-of-interfaces-gson/15557654# 15557654 – dimo414