SpringBoot使用ObjectMapper之Long和BigDemical类型的属性字符串处理,防止前端丢失数值精度

SpringBoot使用ObjectMapper之Long和BigDemical类型的属性字符串处理,防止前端丢失数值精度!

方式一:注解

使用注解 @JsonFormat(shape = JsonFormat.Shape.STRING),如下:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Demo implements Serializable {
    private static final long serialVersionUID = -2148559076064821626L;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private BigDecimal price;
}

测试

    @Autowired
    protected ObjectMapper objectMapper;

    @Test
    public void objectMapperTest() throws Exception {
        Demo demo = new Demo(Long.MAX_VALUE, new BigDecimal("12.34"));
        System.out.println(objectMapper.writeValueAsString(demo));
        demo = objectMapper.readValue("{\"id\":\"9223372036854775807\",\"price\":123.4}", Demo.class);
        System.out.println(objectMapper.writeValueAsString(demo));
    }

输出

{"id":"9223372036854775807","price":"12.34"}
{"id":"9223372036854775807","price":"123.4"}

方式二:自定义序列化转换器

自定义序列化转换器代码

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class MyNumberSerializer extends StdSerializer<Number> {
    private static final long serialVersionUID = -4714217911586331902L;

    public MyNumberSerializer() {
        super(Number.class);
    }

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

使用自定义序列化转换器

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Demo implements Serializable {
    private static final long serialVersionUID = -2148559076064821626L;

    @JsonSerialize(using = MyNumberSerializer.class)
    private Long id;

    @JsonSerialize(using = MyNumberSerializer.class)
    private BigDecimal price;
}

想在所有实体类中生效而避免添加注解:@JsonSerialize(using = MyNumberSerializer.class),可使用全局配置,如下:

    @Autowired
    protected ObjectMapper objectMapper;

    @Before
    public void beforeTest() {
        // 全局配置
        SimpleModule module = new SimpleModule();
        module.addSerializer(Long.class, new MyNumberSerializer());
        module.addSerializer(BigDecimal.class, new MyNumberSerializer());
        objectMapper.registerModule(module);
    }

    @Test
    public void objectMapperTest() throws Exception {
        
        Demo demo = new Demo(Long.MAX_VALUE, new BigDecimal("12.34"));
        System.out.println(objectMapper.writeValueAsString(demo));
        demo = objectMapper.readValue("{\"id\":9223372036854775807,\"price\":\"123.4\"}", Demo.class);
        System.out.println(objectMapper.writeValueAsString(demo));
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值