在杰克逊中禁用数字到字符串的自动转换

时间:2019-06-20 04:12:00

标签: java spring-boot jackson-databind

当我向spring boot后端发出json请求时,Jackson会自动将数字转换为字符串。有办法防止这种情况吗?

例如:

JSON

{
    "numberAsString": 123
}

JAVA

private String numberAsString;
将JSON值绑定到Java字段numberAsString后,

等于"123"。我需要阻止这种自动转换,并且需要在发生这种情况时引发某种异常。

1 个答案:

答案 0 :(得分:0)

您可以创建自定义反序列化器,并使用@JsonDeserialize注释来注释类型:

public class CustomDeserializer extends StdDeserializer<String> {
    protected CustomDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        JsonToken currentToken = jsonParser.getCurrentToken();
        int id = currentToken.id();
        if(id != JsonToken.VALUE_STRING.id()) {
            throw new IOException("Field value is not string json type");
        } else {
            return currentToken.asString();
        }
    }
}

然后在您的模型类中:

@JsonDeserialize(using = CustomDeserializer.class)
private String numberAsString;

您还可以创建自己的扩展IOException的异常并将其从反序列化器中抛出。

如果您不想这样注释每个字段,则可以使用其生成器全局配置对象映射器:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder()
             .deserializerByType(String.class, new CustomDeserializer());
}