अद्यतन: नहीं है https://github.com/acebaggins/gson-serializers जो कई अमरूद संग्रह शामिल हैं:
ImmutableList
ImmutableSet
ImmutableSortedSet
ImmutableMap
ImmutableSortedMap
कैसे एक भी deserializer सभी ImmutableList के लिए काम लिखने के लिए?
विचार सरल है, को बदलने से पारित कर दिया Type
एक Type
List<T>
का प्रतिनिधित्व करने में एक ImmutableList<T>
का प्रतिनिधित्व करने वाले एक List
बना सकते हैं और यह एक ImmutableList
कन्वर्ट करने के लिए Gson
की क्षमता में निर्माण का उपयोग करें।
class MyJsonDeserializer implements JsonDeserializer<ImmutableList<?>> {
@Override
public ImmutableList<?> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
final Type type2 = ParameterizedTypeImpl.make(List.class, ((ParameterizedType) type).getActualTypeArguments(), null);
final List<?> list = context.deserialize(json, type2);
return ImmutableList.copyOf(list);
}
}
एक से अधिक जावा लाइब्रेरीज मैं उपयोग में ParameterizedTypeImpl
वर्ग हैं, लेकिन उनमें से कोई सार्वजनिक उपयोग के लिए इरादा है। मैंने इसे sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
के साथ परीक्षण किया।
कैसे सब ImmutableList के लिए यह रजिस्टर करने के लिए?
हिस्सा मामूली बात है यही कारण है, रजिस्टर करने के लिए पहला तर्क java.lang.reflect.Type
है जो मुझे ParameterizedType
उपयोग करते हुए, जहां बस Class
है काम का उपयोग करने को गुमराह:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class, myJsonDeserializer)
.create();
क्या हम पैरामीटरेट टाइपटाइम्पल का उपयोग करने से बच सकते हैं? उदाहरण के लिए smth का उपयोग करके: अंतिम सूची > सूची = context.deserialize (json, list.class); –
@Alexander Bezrodniy: मुझे डर है, यह संभव नहीं है। आप 'TypeAdapter>' का उपयोग कर इसे से बच सकते हैं, लेकिन फिर आपको कुछ अन्य बॉयलरप्लेट कोड लिखना होगा: 1।'कार्यान्वयन' लागू करें भले ही डिफ़ॉल्ट कार्यान्वयन पर्याप्त होगा, 2. 'read' में' null' के साथ सौदा करें। यह सब कुछ कम स्तर की सामग्री है। –
maaartinus
मुझे लगता है कि अब मैं आपका प्रश्न समझता हूं। आप जेनेरिक छोड़ नहीं सकते; उनके बिना सूची सामग्री ठीक से deserialized नहीं किया जा सकता है। – maaartinus