如何通过Jackson将字符串类型的houseNumber值转换为0以解决反序列化错误?
如何通过Jackson将字符串类型的houseNumber值转换为0以解决反序列化错误?
我之前也碰到过一模一样的场景,API返回字段类型不统一真的很头疼!这里给你两个实用的解决方案,都能轻松搞定这个Jackson反序列化的问题:
方案一:自定义Jackson反序列化器
这种方法灵活性最高,能覆盖所有非数字字符串的情况,不管API返回的是"NO NUMBER"还是其他奇怪的字符串,都能统一转成0。
首先写一个自定义的反序列化器类,继承Jackson的JsonDeserializer<Integer>:
public class HouseNumberDeserializer extends JsonDeserializer<Integer> { @Override public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode node = p.getCodec().readTree(p); // 先判断是不是字符串类型,是的话直接返回0 if (node.isTextual()) { return 0; } // 如果是数字类型,正常转成int返回 else if (node.isNumber()) { return node.asInt(); } // 其他异常情况也默认返回0 return 0; } }
然后在你的Address类的houseNumber字段上加上@JsonDeserialize注解,指定用我们刚才写的反序列化器:
@JsonInclude(JsonInclude.Include.NON_NULL) public class Address implements Serializable { private static final long serialVersionUID = -7134571546367230214L; private String street; @JsonDeserialize(using = HouseNumberDeserializer.class) private int houseNumber; private String district; private String city; private String state; private String zipCode; // 省略getter、setter方法 }
方案二:用@JsonSetter在setter方法里处理
如果不想额外写一个反序列化器类,这种轻量的方法更适合你。我们可以把houseNumber的类型改成Integer(因为int是基本类型不能接收null,用包装类型更灵活),然后在setter方法里做类型判断和转换:
修改后的Address类代码:
@JsonInclude(JsonInclude.Include.NON_NULL) public class Address implements Serializable { private static final long serialVersionUID = -7134571546367230214L; private String street; private Integer houseNumber; private String district; private String city; private String state; private String zipCode; @JsonSetter public void setHouseNumber(Object value) { if (value instanceof String) { // 字符串类型直接设为0 this.houseNumber = 0; } else if (value instanceof Number) { // 数字类型转成Integer this.houseNumber = ((Number) value).intValue(); } else { // 其他异常情况默认设为0 this.houseNumber = 0; } } // 如果需要对外暴露的是int类型,可以在getter里做处理 public int getHouseNumber() { return houseNumber != null ? houseNumber : 0; } // 省略其他字段的getter、setter方法 }
两种方法都能解决你的问题,你可以根据自己的项目情况选一个就行~
备注:内容来源于stack exchange,提问作者Allan Juan
相关产品推荐
相关产品推荐

