java - 无法使用 Java 和 Jackson 将 JSON 文件正确反序列化为 map

标签 java java-8 jackson deserialization json-deserialization

我有一个 JSON 文件,其内容是结构图 Map<LocalDate, Map<String, List<FlexiServer>>> ,当我尝试使用对象映射器将这个 JSON 文件读取到 map 中时,它不会按预期生成 map 。

读取JSON文件的函数

private Map<LocalDate, Map<String, List<FlexiServer>>> loadOnDailyBasis(String path)
        throws IOException {

        InputStream stream = this.getClass().getResourceAsStream(path);
        return JSON_MAPPER.readValue(stream, Map.class);
    }

调用该函数并将其加载到名为 data 的映射中

Map<LocalDate, Map<String, List<FlexiServer>>> data = loadOnDailyBasis(
            "/testdata/servers/dailyservers.json");

数据是一个LinkedHashMap,其键为日期,值为LinkedHashMap。作为内部映射的值具有字符串形式的键和 ArrayList 形式的值。到这里为止都还好,但是当我看到这个 ArrayList 的内容时,它又是一个链接的 HashMap ,其中键是字段的名称,值是它的值。这是错误的。

enter image description here

请建议我如何正确反序列化它。

最佳答案

因此,在阅读 here 中有关 Map 序列化和反序列化的内容后我发现我们可以使用类型引用来正确映射到所需的数据结构。

private Map<LocalDate, Map<String, List<FlexiServer>>> loadOnDailyBasis(String path)
        throws IOException {

        InputStream stream = this.getClass().getResourceAsStream(path);
        TypeReference<Map<LocalDate, Map<String, List<FlexiServer>>>> typeRef = new TypeReference<Map<LocalDate, Map<String, List<FlexiServer>>>>() {
        };
        return JSON_MAPPER.readValue(stream, typeRef);
    }

关于java - 无法使用 Java 和 Jackson 将 JSON 文件正确反序列化为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60563305/

相关文章:

java - AppEngine 端点 JsonMappingException - 避免字段被序列化

java - 我在运行我的项目时收到 java.lang.StackOverflowError?

java - android中的 fragment ,应用程序未安装

java - 在 Java 8 中使用 Lambda 遍历一个 Map of Maps?

Java8 Stream .orElseThrow 未报告的异常错误

java - 在java 8中从LocalDateTime减去/添加 "zone diff time"的最有效方法是什么

java - Spring Boot Jackson 日期和时间戳格式

java - 在安全模式下使用 Xalan 执行 XSLT 以创建 XHTML 在创建属性时抛出 TransformerConfigurationException

java - 抛出和捕获异常的影响大吗?

java - Jackson 序列化列表实体(将字段添加到根列表)