मैं एक enum है:GSON गैर केस संवेदनशील Enum Deserialization
enum Type {
LIVE, UPCOMING, REPLAY
}
और कुछ JSON:
{
"type": "live"
}
और एक वर्ग:
class Event {
Type type;
}
जब मैं deserialize करने की कोशिश जेएसओएन, जीएसओएन का उपयोग करते हुए, मुझे टाइप फ़ील्ड के लिए null
प्राप्त होता है, क्योंकि टाइप फ़ील्ड के मामले में JSON enum से मेल नहीं खाता है।
Events events = new Gson().fromJson(json, Event.class);
अगर मैं निम्नलिखित करने के लिए enum बदलने के लिए, तो सब ठीक काम करता है:
enum Type {
live, upcoming, replay
}
हालांकि, मैं सभी अपरकेस के रूप में enum स्थिरांक छोड़ने के लिए चाहते हैं।
मुझे लगता है कि मुझे एडाप्टर लिखने की ज़रूरत है, लेकिन मुझे कोई अच्छा दस्तावेज या उदाहरण नहीं मिला है।
सबसे अच्छा समाधान क्या है?
संपादित करें:
मैं एक JsonDeserializer काम कर पाने में सक्षम था। हालांकि इसे लिखने का एक और सामान्य तरीका है, क्योंकि हर बार इसे लिखना दुर्भाग्यपूर्ण होगा क्योंकि एनम मूल्यों और जेएसओएन तारों के बीच एक मामला गलत मिलान है।
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_ लोअरकेस एनम मान और _deserializes_ केवल लोअरकेस मानों के सटीक मिलान के लिए सही है। केस-असंवेदनशील deserialization प्रदर्शन करने के लिए, पढ़ने() विधि संशोधित करें: 'वापसी लोअरकेस ToConstant.get (toLowercase (reader.nextString()))। और मूल मामले का उपयोग करके क्रमबद्ध करने के लिए, लिखें() विधि संशोधित करें: 'out.value (value.toString())'। – nivs