GSON正确地序列化枚举,但将其反序列化为字符串

时间:2016-11-23 19:11:05

标签: java serialization enums gson deserialization

    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()方法永远不会是。

1 个答案:

答案 0 :(得分:2)

以下是使用Gson进行枚举反序列化的正确方法。

List<Skill> items = new Gson().<List<Skill>>fromJson(json, new TypeToken<List<Skill>>(){}.getType())