zoukankan      html  css  js  c++  java
  • 一、SpringBoot中Josn解析方案(SpringBoot系列)

    1. Springboot默认的json解析方案

    Springboot中已经集成JackJsonimage-20210511103327166

    springboot在Controller层加上@RestController注解后,就可以接收、返回 json数据的原因是:

    HttpMessageConverter,这是一个消息转换工具,有两个功能:

    1. 将服务端返回的对象序列化成JSON字符串
    2. 将前端传来的JSON字符串反序列化为Java对象。

    SpringMVC自动配置了JackJson和Gson的HttpMessageConterver,所以如果用的是这两个json框架,不需要额外配置,只需要把依赖添加上。

    JackJson由SpringBoot已经集成了,若想使用Gson,需要将SpringBoot-starer-web中引入的JackJson的依赖排除掉,再引入Gson的依赖

    2. 自定义JackJson-httpMessageConverter

    image-20210511105345782

    1. 从JacksonHttpMessageConvertersConfiguration中可以看到,若没有自己提供MappingJacjson2HttpMessageConverter,则自动注入一个,我们想自己定义一些转换规则的话,可以自己定义一个Mappingjackson2HttpMessageConverter,如下:
    @Configuration
    public class JsonConfig {
        
        @Bean
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter( ) {
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
            mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
            return mappingJackson2HttpMessageConverter;
        }
    }
    
    
    1. 除了上面的这种方式,我们能看到主要规定转换方式的类是ObjectMapper实现的,而ObjcetMapper是在JackSonAutoConfiger中注入的,能发现ObjectMapper同MappintJack2HttpMessageConverter一样,如果没有自己注入,则自动注入一个。

      我们也可以通过只实现ObjectMapper的方式,在自定义转换方法,如下:

      image-20210511133634523

      @Configuration
      public class JacksonConfig {
      
        @Bean
        @Primary
        @ConditionalOnMissingBean(ObjectMapper.class)
         ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){
          ObjectMapper objectMapper = builder.createXmlMapper(false).build();
         objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
          return objectMapper;
        }
      }
      

      3. 自定义Gson-httpMessageConverter

    image-20210511134735218

    image-20210511135128331

    1. 从GsonHttpMessageConvertersConfiguration中可以看到,这里注入了一个GsonHttpMessageConverter,同上面JsckJson一样,我们有两种方式自定义转换方式:
      1. 通过自定义GsonHttpMessageConverter
      2. 通过自定义Gson
    @Configuration
    public class JacksonConfig {
    
      @Bean
       GsonHttpMessageConverter gsonHttpMessageConverter(){
         GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
         converter.setGson(new GonBuilder().setDateFormart("yyyy/MM/dd").create())
        return converter;
      }
    }
    
    @Configuration
    public class JacksonConfig {
      @Bean
        Gson gsonHttpMessageConverter(){
       return new GonBuilder().setDateFormart("yyyy/MM/dd").create();
      }
    }
    

    3. 使用FastJson

    如果想使用FastJson的话,需要手动的注入FastJsonHttpMessageConverter

    @Configuration
    public class JacksonConfig {
        
      @Bean
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
        	FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        	FastJsonConfig config = new FastJsonConfig();
        	config.setDateFormart("yyyy/MM/dd");
            converter.setFastJsonConfig(config);
       return converter;
      }
    }
    

    4. 自定义HttpMesageConverter的真实使用场景

    在使用雪花算法生成的id的时候发现,后端使用Long类型存储到前端js接收的时候,因为js使用Number类型接口,Number类型的长度是16位,而雪花算法生成的id是19位,会出现精度损失的问题。

    解决方法:

    后端的ID(Long) ==> Jackson(Long转String) ==> 前端使用String类型的ID,前端使用js string精度就不会丢失了。

    后端(Long)接收前端数据(String)的时候,不用额外做处理,这是Spring反序列化参数接收默认支持的行为。

    /**
    * 这里使用的是JackJson,使用其他json框架的,可以以此类推
    */
    @Configuration
    public class JacksonConfig {
      
      @Bean
      @Primary
      @ConditionalOnMissingBean(ObjectMapper.class)
      public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
      {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    
        // 全局配置序列化返回 JSON 处理
        SimpleModule simpleModule = new SimpleModule();
        //JSON Long ==> String
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
      }
    
    }
    

    实际使用场景引用:https://www.cnblogs.com/zimug/archive/2020/08/25/13557662.html

  • 相关阅读:
    程序员到底该怎么给女朋友挑礼物
    漫说测试 | 研发虐我千百遍,我待bug如初恋
    知识是有价值的
    如何防止ASP.NET网站遭受CSRF的攻击
    如何让ASP.NET网站站点不停止 永远持续运行
    在ASP.NET MVC中验证checkbox 必须选中 (Validation of required checkbox in Asp.Net MVC)
    SOA和Web Service介绍
    ASP.NET网站如何显示自己的网页图标
    ASP.NET(C#)中的try catch异常处理机制
    Session.Abandon, Session.Clear和Session.Remove的区别
  • 原文地址:https://www.cnblogs.com/zhaoyuan72/p/14755523.html
Copyright © 2011-2022 走看看