当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 11238123提问 提问时间:2023-11-24 01:22:14阅读次数: 123

最佳答案 问答题库1238位专家为你答疑解惑

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;
}

测试

    @Autowiredprotected ObjectMapper objectMapper;@Testpublic 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);}@Overridepublic 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),可使用全局配置,如下:

    @Autowiredprotected ObjectMapper objectMapper;@Beforepublic void beforeTest() {// 全局配置SimpleModule module = new SimpleModule();module.addSerializer(Long.class, new MyNumberSerializer());module.addSerializer(BigDecimal.class, new MyNumberSerializer());objectMapper.registerModule(module);}@Testpublic 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));}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"SpringBoot使用ObjectMapper之Long和BigDemical类型的属性字符串处理,防止前端丢失数值精度":http://eshow365.cn/6-42161-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!