zoukankan      html  css  js  c++  java
  • 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}
    
  • 相关阅读:
    【题解】Red-Blue Graph Codeforces 1288F 上下界费用流
    【题解】The Magician HDU 6565 大模拟
    HAOI2018游记
    【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp
    【题解】【雅礼集训 2017 Day5】远行 LOJ 6038 LCT
    【题解】Catering World Finals 2015 上下界费用流
    《无问西东...》
    为了世界的和平~一起上caioj~~~!
    新征程~起航!
    bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)
  • 原文地址:https://www.cnblogs.com/lori/p/13293576.html
Copyright © 2011-2022 走看看