我正在尝试为一个类(及其子类)创建自定义JsonSerializer
所以我要遍历班级的领域并做一些事情。
我遇到了一个问题:如果我在课堂上有这样的事情:

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反射方面的经验。

我的部分代码:

@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是否包含元素。

最佳答案

问题是field.getType(),您应该将其更改为field.getGenericType()

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


如果将两个值都打印到控制台,则.getType()仅返回java.util.Map,但是.getGenericType()返回地图的实际类型Map<String, Map<String, Integer>>

关于java - Java:Gson-自定义JsonSerializer中的JSON哈希图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45527857/

10-10 18:50
查看更多