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,用于序列化/反序列化枚举。虽然调用了它创建的TypeAdapter的write()方法,但read()方法永远不会是。
答案 0 :(得分:2)
以下是使用Gson
进行枚举反序列化的正确方法。
List<Skill> items = new Gson().<List<Skill>>fromJson(json, new TypeToken<List<Skill>>(){}.getType())