我有一个枚举:
enum Type {
LIVE, UPCOMING, REPLAY
}
和一些JSON:
{
"type": "live"
}
还有一个类:
class Event {
Type type;
}
当我尝试使用GSON反序列化JSON时,我收到Event
类型字段的null
,因为JSON中类型字段的大小写与枚举的大小写不匹配。
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());
}
}
4条答案
按热度按时间tct7dpnv1#
我发现(刚才)一个更简单的方法是使用
@SerializedName
注解,我在这里的EnumTest.java
中找到了它(ln 195附近的Gender
类):https://code.google.com/p/google-gson/source/browse/trunk/gson/src/test/java/com/google/gson/functional/EnumTest.java?r=1230
这假定所有类型都将以小写形式出现,而不是“不区分大小写”。
这是我找到的最简单最通用的方法,希望对你有帮助。
wooyq4lh2#
现在,您可以为
@SerializedName
添加多个值,如下所示:我想这对你来说有点晚了,但我希望它能帮助其他人!
cnwbcb6i3#
为了方便起见,这与TypeAdapterFactory's Javadoc中给出的示例非常接近:
jm81lzqq4#
这是一个相当古老的问题,但公认的答案对我不起作用,使用
@SerializedName
是不够的,因为我想确保我可以匹配"value"
、"Value"
和"VALUE"
。我设法根据问题中发布的代码制作了一个通用适配器:
使用方法: