GSON 不区分大小写的枚举反序列化

2022-09-01 05:30:32

我有一个枚举:

enum Type {
    LIVE, UPCOMING, REPLAY
}

还有一些JSON:

{
    "type": "live"
}

和一个类:

class Event {
    Type type;
}

当我尝试使用GSON反序列化JSON时,我收到了类型字段,因为JSON中类型字段的大小写与枚举的大小写不匹配。nullEvent

Events events = new Gson().fromJson(json, Event.class);

如果我将枚举更改为以下内容,则一切正常:

enum Type {
    live, upcoming, replay
}

但是,我想将枚举常量保留为全部大写。

我假设我需要编写一个适配器,但没有找到任何好的文档或示例。

什么是最佳解决方案?


编辑:

我能够让JsonDeserializer工作。有没有一种更通用的方法来编写它,因为每次枚举值和JSON字符串之间存在大小写不匹配时都必须编写此内容,这将是不幸的。

protected static class TypeCaseInsensitiveEnumAdapter implements JsonDeserializer<Type> {
    @Override
    public Type deserialize(JsonElement json, java.lang.reflect.Type classOfT, JsonDeserializationContext context)
            throws JsonParseException {         
        return Type.valueOf(json.getAsString().toUpperCase());
    }
}

答案 1

我发现(刚才)执行此操作的一种更简单方法是使用注释。我在这里找到了它(ln 195周围的类):@SerializedNameEnumTest.javaGender

https://code.google.com/p/google-gson/source/browse/trunk/gson/src/test/java/com/google/gson/functional/EnumTest.java?r=1230

这假设您的所有类型都将以小写形式出现,而不是“不区分大小写”

public enum Type {
    @SerializedName("live")
    LIVE,

    @SerializedName("upcoming")
    UPCOMING,

    @SerializedName("replay")
    REPLAY;
}

这是我发现的最简单,最通用的方法。希望它能帮助你。


答案 2

现在,您可以为其添加多个值,如下所示:@SerializedName

public enum Type {
    @SerializedName(value = "live", alternate = {"LIVE"})
    LIVE,

    @SerializedName(value = "upcoming", alternate = {"UPCOMING"})
    UPCOMING,

    @SerializedName(value = "replay", alternate = {"REPLAY"})
    REPLAY;
}

我认为这对你来说有点晚了,但我希望它能帮助其他人!


推荐