HashSet<Skill> tmp = new HashSet<Skill>();
tmp.add(Skill.WOODCUTTING);
tmp.add(Skill.FIREMAKING);
String j;
System.out.println(j = new GsonBuilder().create().toJson(tmp));
System.out.println(new GsonBuilder().create().fromJson(j, HashSet.class));
for (Object e : new GsonBuilder().create().fromJson(j, HashSet.class)) {
System.out.println(e.getClass());
System.out.println(e.toString());
}技能是一个定义如下的枚举:
@SerializedName("w") WOODCUTTING("Woodcutting"),
@SerializedName("m") MINING("Mining"),
@SerializedName("f") FISHING("Fishing"),上述代码的输出:
[11:04:18 INFO]: ["fir","w"]
[11:04:18 INFO]: [w, fir]
[11:04:18 INFO]: class java.lang.String
[11:04:18 INFO]: false
[11:04:18 INFO]: w
[11:04:18 INFO]: class java.lang.String
[11:04:18 INFO]: false
[11:04:18 INFO]: fir如您所见,它首先正确地构建Gson,但随后它似乎将其反序列化为字符串而不是枚举。我有点搞不懂这里发生了什么--默认情况下不是由Gson支持的枚举吗?
我还尝试注册一个用于序列化/反序列化枚举的TypeAdapterFactory。尽管它创建的TypeAdapters的write()方法被调用,但read()方法从未调用过。
发布于 2016-11-23 19:21:34
下面是使用Gson进行枚举反序列化的正确方法。
List<Skill> items = new Gson().<List<Skill>>fromJson(json, new TypeToken<List<Skill>>(){}.getType())https://stackoverflow.com/questions/40772435
复制相似问题