ObjectMapper在结尾字符上不会失败

问题描述 投票:2回答:2

我正在上以下课:

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;
    }

我期望它会失败,但我会在输入中得到第一个对象,即“第一个”汽车对象。

为什么会这样?

java json jackson objectmapper
2个回答
2
投票

在这种情况下,您需要启用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_*系列的所有功能尽可能严格。


0
投票

替代。请注意,您的类型引用不是Car,而是ListCar

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
© www.soinside.com 2019 - 2024. All rights reserved.