2017-08-06 44 views
1

我正在嘗試爲類(以及它的子級)創建自定義JsonSerializer。 所以我遍歷了這個類的Fields並做了一些東西。 我面臨的問題:如果我有在我的課是這樣的:Java:Gson - 哈希映射到自定義JsonSerializer中的JSON

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

它變成{}。我檢查過,它有創建元素,GSON無法正確處理它。如果我嘗試在沒有JsonSerializer的情況下使用GSON,它就會起作用。顯然,我做錯了什麼。我對Java Reflection沒有太多經驗。我的代碼

部分:

@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

問題是field.getType(),您應該將其更改爲field.getGenericType()

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

如果打印兩個值到控制檯中,.getType()回報只是一個java.util.Map,但.getGenericType()返回的實際類型地圖的Map<String, Map<String, Integer>>