我正在用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
并且其值为Strings
的KillCountRatios
,但是运行时版本看到的只是应该读取Map
(因为这就是全部保留的信息)。而且,由于ObjectMapper
的默认行为是将未知的JSON对象读入HashMap
(在本例中为LinkedHashMap
来保留字段顺序),所以这正是它的作用。
为了使ObjectMapper
正确地将JSON对象反序列化为KillCountRatios
对象,您将必须编写自己的反序列化器(请参见简短的教程here)。