我正在上以下课:
public class Car{
private String id;
private String name;
public Car() {
}
public Car(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
而且我像这样使用它:
String json = "{\"id\":\"1\", \"name\":\"hh\"} {\"id\":\"2\", \"name\":\"ccc\"}";
Car car;
try {
ObjectMapper mapper = new ObjectMapper();
car = mapper.readValue(json, new TypeReference<Car>() {
});
} catch (IOException e) {
car = null;
}
我期望它会失败,但我会在输入中得到第一个对象,即“第一个”汽车对象。
为什么会这样?
在这种情况下,您需要启用FAIL_ON_TRAILING_TOKENS功能以引发异常:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
或从2.10
版本开始:
ObjectMapper mapper = JsonMapper.builder()
.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS)
.build();
来自文档:
绑定对象后确定数据绑定行为的功能根值。如果启用此功能,则再打一次进行
JsonParser.nextToken()
以确保找不到更多令牌(如果找到,则抛出MismatchedInputException
);如果禁用,不做进一步检查。功能也可以是称为READ_FULL_STREAM
,因为它可以有效地验证该输入流仅包含绑定整个文件所需的数据值,仅此而已(可能的可忽略空格或注释(如果数据格式支持)。功能为默认禁用(因此不进行任何检查出于向后兼容的原因,尾随令牌)。
您可以使FAIL_ON_*
系列的所有功能尽可能严格。