我正在上以下课:
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_*
系列的所有功能尽可能严格。
替代。请注意,您的类型引用不是Car
,而是List
的Car
。
final ObjectMapper mapper = new ObjectMapper();
final TypeReference<List<Car>> typeReference = new TypeReference<List<Car>>() {};
final String json = "{\"id\":\"1\", \"name\":\"hh\"} {\"id\":\"2\", \"name\":\"ccc\"}";
List<Car> cars = null;
try {
cars = mapper.readValue(json, typeReference);
} catch (IOException e) {
e.printStackTrace(); // TODO - Please, handle it
cars = null;
}
System.out.println("Cars: " + cars);
它将打印:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<com.yk.training.backperssure.Car>` out of START_OBJECT token
at [Source: (String)"{"id":"1", "name":"hh"} {"id":"2", "name":"ccc"}"; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1464)
// More stack trace.,..\
Cars: null