阻止杰克逊将数字读取为字符串

era*_*era 3 java jackson jackson2

Jackson 将输入数字读取为字符串。作为下面的示例,Student 类将名称 4567 读取为字符串。

例如:输入

{
name: 4567
...
}
Run Code Online (Sandbox Code Playgroud)

Java类

Class Student {

String name;
...
}
Run Code Online (Sandbox Code Playgroud)

Jackson 正在解析 JSON 文本并将数字值映射到字符串字段,我不需要类型转换,即将数字转换为字符串。在这种情况下,Jackson 将值从 int (4567) 转换为 String("4567")。如果提供的其他类型失败,此行为如何更改以引发异常?

Spa*_*ara 5

注册的自定义解串器java.lang.String肯定可以工作并让您防止转换。反序列化器将直接查看内容,JsonParser以便它们可以检测底层令牌类型。

这将帮助您:

public class ForceStringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        if (jsonParser.getCurrentToken() == JsonToken.VALUE_NUMBER_INT) {
            throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Attempted to parse int to string but this is forbidden");
        }
        return jsonParser.getValueAsString();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多信息。