一、SpringBoot中Josn解析方案(SpringBoot系列)

2021-05-30 08:04

阅读:388

标签:nconf   mesa   ber   ima   方法   add   序列   ora   全局配置   

1. Springboot默认的json解析方案

Springboot中已经集成JackJson技术图片

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

技术图片

  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的方式,在自定义转换方法,如下:

    技术图片

    @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

技术图片

技术图片

  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

一、SpringBoot中Josn解析方案(SpringBoot系列)

标签:nconf   mesa   ber   ima   方法   add   序列   ora   全局配置   

原文地址:https://www.cnblogs.com/zhaoyuan72/p/14755523.html


评论


亲,登录后才可以留言!