2017-08-06 46 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>>