我有一個枚舉: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