我正在将分数(KillcountRatio 类)保存到我使用 Jackson JSON 保存的 HashMap 中的名称(字符串),但是在加载保存的 json 文件时,无法转换存储在HashMap 具有特定的 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 )。
关于java - JSON jackson 将 hashmap 的类值读取为 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56523832/