• springboot~重写json序列化方式


    在springboot里,推荐我们通过WebMvcConfigurer的派生类重写你的请求,你可以利用WebMvcConfigurer对http请求添加一些拦截器,addCorsMappings,addResourceHandlers,消息返回格式等等,需要注意的是,你需要使用@EnableWebMvc注解override springboot默认的方法;WebMvcConfigurer虽然是接口,但它的方法都是有default默认实现的。

    public interface WebMvcConfigurer {
        default void configurePathMatch(PathMatchConfigurer configurer) {
        }
    
        default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        }
    
        default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        }
    ...
    }
    

    我们来定义自己的WebMvcConfigurer,并且重写一个JSON输出的格式

    @Configuration
    @EnableWebMvc //覆盖默认的配置
    public class WebMvcConfigurerImpl implements WebMvcConfigurer {
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
    
            /**
             * 序列换成Json时,将所有的Long变成String
             * 因为js中得数字类型不能包括所有的java Long值
             */
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
    
            // 所有的double类型返回保留三位小数
            simpleModule.addSerializer(BigDecimal.class, new MoneySerialize());
    
            // double保留两位小数
            simpleModule.addSerializer(Double.class, new DoubleSerialize());
            simpleModule.addSerializer(Double.TYPE, new DoubleSerialize());
    
            objectMapper.registerModule(simpleModule);
            jackson2HttpMessageConverter.setObjectMapper(objectMapper);
            converters.add(jackson2HttpMessageConverter);
        }
    /**
         * money serializer.
         */
        public class MoneySerialize extends JsonSerializer<Object> {
            //修改要除的数据
            final BigDecimal TEMP = BigDecimal.valueOf(1000000L);
    
            @Override
            public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                if (value != null) {
                    BigDecimal bigDecimal = new BigDecimal(value.toString());
                    gen.writeNumber(bigDecimal.divide(TEMP, 4, RoundingMode.DOWN));
                }
            }
        }
    
        /**
         * double serializer.
         */
        public class DoubleSerialize extends JsonSerializer<Double> {
    
            private DecimalFormat df = new DecimalFormat("##.00");
    
            @Override
            public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers)
                    throws IOException, JsonProcessingException {
                if (value != null) {
                    gen.writeString(df.format(value));
                }
            }
        }
    

    然后我们在返回对象之后,它的double,BigDecimal的属性将被格式化

    {"name":"zzl","email":null,"sex":null,"total":"5.00","totalMoney":0.0001}
    
  • 相关阅读:
    译文高效的JavaScript.
    JavaScript 全半角转换
    js表单验证
    Js事件大全
    Javascript下的urlencode编码解码方法decodeURIComponent()
    加速Javascript:DOM操作优化
    javascript验证日期的函数
    javascript里面的小数计算出现近似值的解决办法
    【busybox】busybox使用总结 01
    Assemble 汇编语言的种类
  • 原文地址:https://www.cnblogs.com/lori/p/13293576.html
Copyright © 2020-2023  润新知