我正在使用Jackson解析 JSON,其中一个字段是任意键和值的字典。Map<String, Object>
如果不是因为我们只允许某些值类型(String
、Long
、和)Double
,这通常会直接映射到 Java 。Long[]
Double[]
目前我们完整解析文档,然后遍历每个映射的每个值并执行instanceof
检查它是否有效,当无效时向用户返回错误。对于我们有很多长文档,这当然是相当低效的。
有没有人知道一种向杰克逊表达这种映射值类型限制的方法,以便在解析期间可以捕获输入中的任何错误?@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()
}
}