java - 使用 Jackson 解析 JSON 时限制 Map 值

标签 java json jackson

我正在使用Jackson解析 JSON,其中字段之一是任意键和值的字典。这通常会直接映射到 Java Map<String, Object>难道我们只允许某些值类型( StringLongDoubleLong[]Double[] )。

当前我们完整解析文档,然后迭代每个映射的每个值并执行 instanceof检查它是否有效,无效时向用户返回错误。对于长文档来说,这当然是相当低效的,因为我们有很多这样的文档。

是否有人知道向 Jackson 表达此映射值类型限制的方法,以便在解析期间可以捕获输入中的任何错误? @JsonSubTypes注释看起来可能相关,但无法弄清楚在这种情况下如何应用它。

以下是我希望替换的代码类型的示例:

static class Doc {
    List<Item> items;
}

static class Item {
    /* ...other fields snipped... */
    public Map<String, Object> payload;

    @JsonIgnore
    public void check() throws Exception {
        for(Object value: item.payload.values()) {
            if(value instanceof String) { 
            else if(value instanceof Long) { }
            else if(value instanceof Long[]) { }
            else if(value instanceof Double) { }
            else if(value instanceof Double[]) { }
            else { throw new Exception("Unsupported value type"); }
        }
    }
}

void read(InputStream stream) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    Doc doc = mapper.readValue(stream, Doc.class);

    // Check all payload types are valid
    for(Item item: doc.items) {
        item.check()
    }
}

最佳答案

好吧,无法找到一种方法来使用 Jackson 提供的注释或类型系统来表达我想要的内容,所以我最终通过编写自定义反序列化器来完成我试图避免的事情。

诚然,这确实允许对允许的数据类型和解析错误进行更简洁的控制,但它比我希望的更详细!

关于java - 使用 Jackson 解析 JSON 时限制 Map 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13432491/

相关文章:

java - 如何将 Java 应用程序导出为可运行的?

Java 在 O(1) 中合并 2 个集合

java - 当 json 中有韩语时,使用 embulk-output-bigquery 插件 Embulk 作业失败

javascript - 将 HTML div 内容转换为 json 对象

java - 使用 StdDeserializer Jackson 2.5 处理多态

java - 什么是 <context :spring-configured/>? 的 spring java 配置

java - 对 jTable 中的列求和?

c# - Restsharp:反序列化具有比某些类更少/更多字段的 json 对象

java - 如何在自定义 getter 中序列化 JSON 对象?

java - 我有一个 json 字符串,但无法提取特定字段