java - JSON jackson 将 hashmap 的类值读取为 LinkedHashMap

标签 java json oop jackson objectmapper

我正在将分数(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/

相关文章:

java - 为什么 String 方法regionMatches 不委托(delegate)给重载方法

java - 当数组已声明为全局变量时,如何在方法内初始化数组?

java - Hibernate 事务管理器问题

json - 如何在aspnet vnext配置的环境变量中表示json数组

javascript - 无法将 json 转换为 javascript 对象/数组

C++ #include,嵌套包含如何工作?

java - 在没有 RequestDispatcher 的情况下将值从 servlet 传递到 JSP 文件

java - 将 Jackson2 与 Spring 4.0 (MVC + REST+ Hibernate) 结合使用

python - 为继承设计时为什么是 "use properties to hide functional implementation"?

java - android 中很难面向对象 "transplantation"