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)
或者,您可以注册PlayerTypeAdapter
for 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)
归档时间: |
|
查看次数: |
13603 次 |
最近记录: |