我有一个枚举:GSON不区分大小写的枚举反序列
enum Type {
LIVE, UPCOMING, REPLAY
}
和一些JSON:
{
"type": "live"
}
和A类:
class Event {
Type type;
}
当我尝试反序列化JSON,使用GSON,我收到null
为Event
类型字段,因为类型字段的情况在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());
}
}
请注意,上述代码仅对小写值的精确匹配才正确_serializes_小写的Enum值和_deserializes_。 要执行不区分大小写的反序列化,请修改read()方法: 'return lowercaseToConstant.get(toLowercase(reader.nextString()))''。 要使用原始大小写序列化,请修改write()方法: 'out.value(value.toString())'。 – nivs 2017-10-24 23:33:05