FastJson⾃定义全局序列化⽅式与源码解析
FastJson⾃定义全局序列化⽅式与源码解析
⽂章⽬录
前⾔
在进⾏序列化时,我们会遇到Long型序列化到前端出现精度丢失的问题。这种情况通常可以通过直接在属性上使⽤@JSONField指定string类型的序列化来解决,但是我们也可以通过⾃定义全局配置来解决该问题,本⽂通过分析源码⼀步步调整,可以帮助像我⼀样的菜狗在遇到百度查不到的问题时提供⼀种解决思路。
⼀、fastjson是什么?
fastjson是阿⾥巴巴的开源JSON解析库,它可以解析JSON格式的字符串,⽀持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
⼆、开搞
⾸先我们创建⼀个配置类实现WebMvcConfigurer或继承WebMvcConfigurationSupport:
@EnableWebMvc
@Configuration
public class WebJsonConfig implements WebMvcConfigurer {
}
这⾥解释⼀下@EnableWebMvc这个注解,如果我们不加这个注解,容器中依旧会加载springboot的默认⾃动配置。
我们可以从源码来看⼀下,@EnableWebMvc这个注解 上⾯导⼊了⼀个webmvc的代理配置类DelegatingWebMvcConfiguration.class
进⼊这个类,我们可以看到该类继承了WebMvcConfigurationSupport 并使⽤代理配置组件重写了所有的配置,⽅法,
通过阅读springboot的⾃动配置我们可以发现springboot会在当前容器中不存在WebMvcConfigurationSu
pport的bean时才将会装载默认配置bean,由于我们的⾃定义的配置类加上了@EnableWebMvc注解,此时容器中已经存在WebMvcConfigurationSupport的⼦类bean了,于是springboot默认的⾃动配置便不会装载,系统就会使⽤我们的⾃定义配置类。
fastjson常用方法接下来我们进⼊WebMvcConfigurer
可以看到原来l的基本都由这个类来承担了,我们可以重写⾥⾯的⽅法来对,视图解析器,视图控制器,全局异常处理进⾏⾃定义配置。我们今天设置序列化的⽅法⽤到的是configureMessageConverters的这个⽅法。
接下来我们准备重写该⽅法,从该⽅法的参数中我们可以看到⼊参是⼀个 HttpMessageConverter的集合,并且该⽅法是⼀个void⽅法,那么我们要做的操作⼀定对该集合进⾏操作。
这⾥我们通过阅读springboot的源码可以知道,只要将我们⾃定义的消息转换add到集合中就可以了。
那么FastJson已经给我们封装好了⼀个消息转换类,我们只需要创建这么⼀个对象,并对该对象进⾏我们的⾃定义配置后,添加到converters集合中就可以了。
于是我们的⽅法重写第⼀步开始了:
@EnableWebMvc
@Configuration
public class WebJsonConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
FastJsonHttpMessageConverter fastConverter =new FastJsonHttpMessageConverter();
//待完善
//
//
converters.add(fastConverter);
}
}
接下来我们需要对fastjson的消息转换进⾏我们⾃⼰的配置
点进源码,我们可以看到这⾥存在⼀个⼀个⽅法,刚好就是⽤来设置fastjson的配置,但是需要我们传⼀个FastJsonConfig的对象。
于是我们在代码中新建⼀个fastjsonConfig对象,有了这个对象后我们需要进⾏配置
点击这个类,我们可以看到⼀个设置序列化配置的⽅法。
点进SerializeConfig对象 我们可以看到该类采⽤的是单例设计模式,我们通过globalInstance拿到这个实例。
继续跟代码我们可以发现,该实例的在初始化时 初始化了常见的数据类型的序列化⽅法,将每种类型及对应的序列化⽅法PUT进阿⾥⾃定义的IdentityHashMap数据结构中,我们要改的Long.class也在其中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论