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