GSON没有为一个接口类型调用我的TypeAdapter

Tre*_*kaz 31 java json gson

GSON似乎在做一些技巧,它查看我的JavaBeans的内部字段,而不是使用可公开访问的属性信息.不幸的是,这对我们来说不会飞,因为我们神奇创造的豆子里充满了私人田地,我不希望它存放下来.

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了:

{"privateStuff":"secret","name":"Alice"}
Run Code Online (Sandbox Code Playgroud)

当然,永远不要调用我的类型适配器,这似乎使得无法获得任何其他行为.

non*_*ont 54

我有同样的问题,Gson的2.3.1版本.我通过使用它得到了它

.registerTypeHierarchyAdapter(Player.class, new PlayerTypeAdapter())
Run Code Online (Sandbox Code Playgroud)

代替

.registerTypeAdapter(Player.class, new PlayerTypeAdapter())
Run Code Online (Sandbox Code Playgroud)

  • 应该接受这个作为答案.使用java.util.Calendar(实际类型是java.util.GregorianCalendar) (6认同)

Eri*_*ver 9

当前版本的GSON不能以这种方式工作.这将使用适配器序列化您的类型.

gson.toJson(bean, Player.class)

或者,您可以注册PlayerTypeAdapterfor MagicPlayer.class,您现有的代码也可以使用.GSON仅TypeAdapter通过具体(或顶级)类型查找.因此,您必须为可能遇到的每种具体类型注册自定义类型适配器.

还有TypeHeirarchyAdapter当你想的一样TypeAdapter用于给定类型的所有扩展类.虽然我没有好运,但是我没有花时间研究为什么它对我没有好处.以下是一些相关讨论:https://groups.google.com/forum/?fromgroups =#! searchin/google-gson / interface/google-gson/ 0ebOxifqwb0/OXSCNTiLpBQJ


ale*_*y28 -3

为什么它不起作用:

  1. PlayerTypeAdapter 应该实现 JsonSerializer。可以?

  2. 如果是的话 - 应该可以。它对我来说非常适合,所以不明白为什么它不适合你。在调试中启动应用程序,设置断点并签出。应该有什么原因。

在你的测试中,带适配器的 Gson 构建器在哪里?你应该改变它:

public void testJson() throws Exception
{
    Player player = new MagicPlayer(); //BeanUtils.createDefault(Player.class);
    player.setName("Alice");

    // this is wrong if you want adapter
    /* Gson gson = new Gson(); */

    // this is what you nead
     Gson gson = new GsonBuilder()
        .registerTypeAdapter(Player.class, new PlayerTypeAdapter())
        .create();

    System.out.println(gson.toJson(bean));
}
Run Code Online (Sandbox Code Playgroud)

  • 请先阅读问题,然后再更新您的答案。 (5认同)