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)
当前版本的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
为什么它不起作用:
PlayerTypeAdapter 应该实现 JsonSerializer。可以?
如果是的话 - 应该可以。它对我来说非常适合,所以不明白为什么它不适合你。在调试中启动应用程序,设置断点并签出。应该有什么原因。
在你的测试中,带适配器的 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)