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"}
当然,从不调用我的类型适配器,这似乎使它不可能获得任何其他行为。
为什么它不工作:
>
如果是这样的话,那就应该管用了。它对我来说很好用,所以我不明白为什么它对你不起作用。在调试中启动应用程序,设置断点并签出。应该是有原因的。
在您的测试中,带适配器的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));
}
目前发布的GSON不能以这种方式工作。这将使用适配器序列化您的类型。
gson。toJson(bean,Player.class)
或者,您也可以为MagicPlayer.class注册PlayerTypeAdapter,您现有的代码将正常工作。GSON仅按具体(或顶级)类型查找TypeAdapter
。因此,您必须为您可能遇到的每种具体类型注册一个自定义类型适配器。
有一个TypeHeirarch yAdapter
,用于当您希望相同的TypeAdapter
用于给定类型的所有扩展类时。不过,我在这方面运气不佳,也没有真正花时间研究为什么它对我不起作用。以下是一些相关的讨论:https://groups.google.com/forum/?fromgroups=#!搜索/谷歌-格森/界面/谷歌-格森/0ebOxifqwb0/OXSCNTiLpBQJ
我也有同样的问题,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?