当前位置: 首页 > 知识库问答 >
问题:

GSON不调用我的TypeAdapter类型,这是一个接口

长孙鸿振
2023-03-14

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;
    }
}

这使得:

{"privateStuff":"secret","name":"Alice"}

当然,从不调用我的类型适配器,这似乎使它不可能获得任何其他行为。

共有3个答案

黄隐水
2023-03-14

为什么它不工作:

>

如果是这样的话,那就应该管用了。它对我来说很好用,所以我不明白为什么它对你不起作用。在调试中启动应用程序,设置断点并签出。应该是有原因的。

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

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));
}
杜浩壤
2023-03-14

目前发布的GSON不能以这种方式工作。这将使用适配器序列化您的类型。

gson。toJson(bean,Player.class)

或者,您也可以为MagicPlayer.class注册PlayerTypeAdapter,您现有的代码将正常工作。GSON仅按具体(或顶级)类型查找TypeAdapter。因此,您必须为您可能遇到的每种具体类型注册一个自定义类型适配器。

有一个TypeHeirarch yAdapter,用于当您希望相同的TypeAdapter用于给定类型的所有扩展类时。不过,我在这方面运气不佳,也没有真正花时间研究为什么它对我不起作用。以下是一些相关的讨论:https://groups.google.com/forum/?fromgroups=#!搜索/谷歌-格森/界面/谷歌-格森/0ebOxifqwb0/OXSCNTiLpBQJ

罗鸿畴
2023-03-14

我也有同样的问题,Gson的2.3.1版。我通过使用

.registerTypeHierarchyAdapter(Player.class, new PlayerTypeAdapter())

而不是

.registerTypeAdapter(Player.class, new PlayerTypeAdapter())
 类似资料:
  • 这是我的代码: 我得到的错误是: _类型错误(类型“\u InternalLinkedHashMap

  • 问题内容: 我正在处理一些服务器代码,其中客户端以JSON形式发送请求。我的问题是,有许多可能的请求,每个请求的实现细节都不尽相同。因此,我想使用一个Request接口,它定义为: 从那里,我在名为如下的类中实现了接口: 为了使用JSON,我创建了一个实例并注册了一个,如下所示: 然后,如下面的代码片段所示,我使用了它: 我得到了预期的输出。 我希望做的是用类似于以下内容的内容替换该行,但是这样做

  • 我有一个json格式的地图列表,我正试图在列表上呈现“title”。 我通过一个api(http.get)读取数据,然后解析它。 我想在列表中显示标题。 这是我的代码... 获取数据 转换为json 欢迎参加模范班 我得到一个错误说"类型'列表'不是类型'地图的子类型

  • 我已经编写了整型适配器,并用作注释来实现以下输出,但在gson库中编写的代码完全不允许使用注释配置进行空处理。 如果我取消注释1,2,4行和注释3行,那么我仍然没有实现我的愿望输出。 当我调试第189行的库代码(给定的屏幕截图)时,没有到达我的自定义适配器代码,因此空处理无法使用注释。有没有其他方法可以根据注释配置实现所需的输出? 期望输出: 猫科动物 - "" (用作注释并具有空值) phone

  • 我正在使用PhantomJS 1.8.2使用JsTestDriver运行一些Jasmine单元测试。使用Chrome测试运行良好,但是使用PhantomJS的大约一半时间,测试结果是没有找到测试用例。 我已经将问题缩小到PhantomJS:无法打开本地JsTestDriver页面()。下面是如何重现的,大约50%的情况下,Loaded…with status…消息从未显示: 在本地启动 JsTes

  • 我正在试图找出如何告诉react哪个元素被用作ref例如在我的例子中 是来自第三方库的SVG组件,以这种方式定义它会导致错误 是否有某种通用的方法来定义哪个元素是ref?