You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:17:32