我正在用Jackson Jackson所保存的HashMap中将分数(KillcountRatio类)保存为名称(字符串),但是在加载保存的json文件时,它无法使用以下方式强制转换存储在HashMap中的KillCountRatio类值: KillCountRatio的特定键,它给出了

无法将java.util.LinkedHashMap强制转换为KillCountRatio

因为存储在HashMap中的值不再是KillCountRatio,而是LinkedHashMap。

不知道要尝试什么。

这是KillCountRatio类:

public final class KillCountRatio {

    private int killCount;

    private int deathCount;

}


这是上面存储的HashMap,并提供了一个String键,然后使用Jackson JSON保存。

private HashMap<String, KillCountRatio> savedScores = new HashMap<>();


保存和加载:

public void save() {
    ObjectWriter  writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
    File f = new File("data/savedScores.json");
    try {
        writer.writeValue(f, savedScores); //written here
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void load() {

    savedScores = new ObjectMapper().readValue(new File("data/savedScores.json"), new HashMap<String, KillCountRatio>().getClass());
}


这是错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.datarepo.KillCountRatio


我该如何克服铸造错误?使用上面的代码说明如何使它工作的一些示例将不胜感激。

我用load方法尝试了这个反序列化器,但仍然给出了相同的错误:

ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(KillCountRatio.class, new KillCountRatioDeserializer());
        mapper.registerModule(module);


我还尝试使用以下方法注释KillCountRatio类:

 @JsonDeserialize(using = KillCountRatioDeserializer.class)

最佳答案

之所以不起作用,是因为泛型在Java中是如何工作的,您可能需要阅读type erasure上的内容。

您试图告诉它应该读取一个键为Map并且其值为StringsKillCountRatios,但是运行时版本看到的只是应该读取Map(因为这就是全部保留的信息)。而且,由于ObjectMapper的默认行为是将未知的JSON对象读入HashMap(在本例中为LinkedHashMap来保留字段顺序),所以这正是它的作用。

为了使ObjectMapper正确地将JSON对象反序列化为KillCountRatios对象,您将必须编写自己的反序列化器(请参见简短的教程here)。

09-05 22:49