मैं एक वर्ग (और उसके बच्चे) के लिए कस्टम JsonSerializer बनाने की कोशिश कर रहा हूं। तो मैं कक्षा के क्षेत्र और सामान के माध्यम से पुनरावृति कर रहा हूँ। मुझे समस्या का सामना करना पड़ा: अगर मेरी कक्षा में ऐसा कुछ है:

public Map<String, Map<String, Integer>> nestedHashMap = new HashMap<String, Map<String, Integer>>() {{
    put("levelOneKey", new HashMap<String, Integer>() {{
        put("levelTwoKey", 25);
    }});
}};

यह {} में बदल जाता है। मैंने जाँच की, इसमें निर्माण के तत्व हैं, GSON इसे ठीक से संभाल नहीं सकता है। अगर मैं जेसनसेरियलाइज़र के बिना जीएसओएन का उपयोग करने की कोशिश करूंगा, तो यह काम करता है। जाहिर है, मैं कुछ गलत कर रहा हूँ। मुझे जावा प्रतिबिंब के साथ ज्यादा अनुभव नहीं है।

मेरे कोड का हिस्सा:

@Override
public JsonElement serialize(JsonConfig src, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject o = new JsonObject();
    //...
    Field[] fields = src.getClass().getDeclaredFields();
    for (Field field : fields) {
        Object fieldValue = null;
        try {
            fieldValue = field.get(src);
        } catch (IllegalAccessException e) {
            System.out.print("IllegalAccessException for field " + field.getName() + ": " + e.toString());
            continue;
        }
        o.add(field.getName(), context.serialize(fieldValue, field.getType()));
    }
    //...
}

मैंने Gson का एक और उदाहरण बनाने और o.add को इसके साथ बदलने की कोशिश की:

o.add(field.getName(), gson.toJson(fieldValue, field.getType()));

मैंने जाँच की, fieldValue में तत्व हैं।

1
user64675 6 अगस्त 2017, 04:41

1 उत्तर

सबसे बढ़िया उत्तर

समस्या field.getType() है, आपको इसे field.getGenericType() में बदलना चाहिए।

o.add(field.getName(), context.serialize(fieldValue, field.getGenericType()));

यदि आप दोनों मानों को कंसोल पर प्रिंट करते हैं, तो .getType() केवल एक java.util.Map देता है, लेकिन .getGenericType() आपके मानचित्र का वास्तविक प्रकार देता है Map<String, Map<String, Integer>>

1
tima 6 अगस्त 2017, 06:00