全局bigdecimal反序列化转String返回数据

问题描述:

VO类有关数据的属性都是Bigdecimal,如果返回给前端的数位超过六位,会被自动转成科学计数法,为了避免这种情况的发生,返给前端的数据最好是String,Bigdecimal有toPlainString方法,能将数值正确转成字符串,但当调用toPlainString的数为null时会报空指针异常,方法、属性过多,不能每一个都做判断。

解决方案:

增加一个Json全局配置,反序列化时,将所有的Bigdecimal用toPlainString方法变成String。
配置文件

@JsonComponent
public class JsonConfig {
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
/**
 * 可配置项:
 * 1.Include.Include.ALWAYS : 默认
 * 2.Include.NON_DEFAULT : 默认值不序列化
 * 3.Include.NON_EMPTY : 属性为 空("") 或者为 NULL 都不序列化
 * 4.Include.NON_NULL : 属性为NULL 不序列化
 **/
        // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

/**
 * 序列化时,将所有的long变成string
 */
        SimpleModule module = new SimpleModule();
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        module.addSerializer(BigDecimal.class, ToStringSerializer.instance);
        module.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance);
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

自定义一个BigDecimalToStringSerializer类

public class BigDecimalToStringSerializer extends StdSerializer<BigDecimal> {
	public static final BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer();

    public BigDecimalToStringSerializer() { super(BigDecimal.class); }

    @Override
    public boolean isEmpty(SerializerProvider prov, BigDecimal value) {
        return value == null;
    }

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(value.toPlainString());
    }

    @Override
    public void serializeWithType(BigDecimal value, JsonGenerator g, SerializerProvider provider,
                                  TypeSerializer typeSer)
            throws IOException
    {
        serialize(value, g, provider);
    }
    public JsonNode getSchema(SerializerProvider provider, Type typeHint) throws JsonMappingException {
    return createSchemaNode("string", true);
    }
    
    public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
    {
        //json类型是String
        visitStringFormat(visitor, typeHint);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值