当前位置:   article > 正文

Spring Boot实现全局序列化配置(Jackson、FastJson)_fastjson和jackson在同一个项目中如何使得序列化正确

fastjson和jackson在同一个项目中如何使得序列化正确

1 Maven依赖

  1. <!--hutool工具包-->
  2. <dependency>
  3. <groupId>cn.hutool</groupId>
  4. <artifactId>hutool-all</artifactId>
  5. <version>5.4.2</version>
  6. </dependency>
  7. <!-- Fastjson序列化工具 -->
  8. <dependency>
  9. <groupId>com.alibaba</groupId>
  10. <artifactId>fastjson</artifactId>
  11. <version>1.2.47</version>
  12. </dependency>

2  Jackson实现全局序列化配置

        具体步骤请查看以下博客。

Jackson 全局序列化配置的2种实现方式(@Bean注解创建ObjectMapper、重写configureMessageConverters方法)icon-default.png?t=L892https://blog.csdn.net/qq_38974638/article/details/120529468

 3 FastJson实现全局序列化配置

3.1 JsonConfig

        全局序列化配置类。

  1. package com.config;
  2. import com.alibaba.fastjson.serializer.SerializeConfig;
  3. import com.alibaba.fastjson.serializer.SerializerFeature;
  4. import com.alibaba.fastjson.support.config.FastJsonConfig;
  5. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  6. import com.serializer.CustomCollectionSerializer;
  7. import com.serializer.CustomDateSerializer;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.http.MediaType;
  10. import org.springframework.http.converter.HttpMessageConverter;
  11. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  12. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  13. import java.util.ArrayList;
  14. import java.util.Date;
  15. import java.util.List;
  16. /**
  17. * 全局序列化配置类
  18. */
  19. @Configuration
  20. @EnableWebMvc
  21. public class JsonConfig implements WebMvcConfigurer {
  22. /**
  23. * 全局序列化方式
  24. *
  25. * @param converters
  26. */
  27. @Override
  28. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  29. //fastjson的全局序列化方式
  30. configureFastJsonHttpMessageConverter(converters);
  31. }
  32. /**
  33. * fastjson的全局序列化方式
  34. *
  35. * @param converters
  36. */
  37. private void configureFastJsonHttpMessageConverter(List<HttpMessageConverter<?>> converters) {
  38. // 定义一个convert转换消息的对象;
  39. FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
  40. //配置Content-Type
  41. List<MediaType> supportedMediaTypes = new ArrayList<>();
  42. supportedMediaTypes.add(MediaType.APPLICATION_JSON);
  43. supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
  44. supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
  45. supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
  46. supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
  47. supportedMediaTypes.add(MediaType.APPLICATION_PDF);
  48. supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
  49. supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
  50. supportedMediaTypes.add(MediaType.APPLICATION_XML);
  51. supportedMediaTypes.add(MediaType.IMAGE_GIF);
  52. supportedMediaTypes.add(MediaType.IMAGE_JPEG);
  53. supportedMediaTypes.add(MediaType.IMAGE_PNG);
  54. supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
  55. supportedMediaTypes.add(MediaType.TEXT_HTML);
  56. supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
  57. supportedMediaTypes.add(MediaType.TEXT_PLAIN);
  58. supportedMediaTypes.add(MediaType.TEXT_XML);
  59. fastConverter.setSupportedMediaTypes(supportedMediaTypes);
  60. // 添加fastjson的配置信息
  61. FastJsonConfig fastJsonConfig = new FastJsonConfig();
  62. fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
  63. SerializerFeature.WriteMapNullValue,
  64. SerializerFeature.WriteNullStringAsEmpty,
  65. SerializerFeature.WriteNullListAsEmpty,
  66. SerializerFeature.DisableCircularReferenceDetect,
  67. SerializerFeature.WriteNonStringKeyAsString
  68. );
  69. SerializeConfig serializeConfig = SerializeConfig.globalInstance;
  70. serializeConfig.put(Long.class, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
  71. serializeConfig.put(Long.TYPE, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
  72. serializeConfig.put(Date.class, new CustomDateSerializer());
  73. serializeConfig.put(ArrayList.class, new CustomCollectionSerializer());
  74. fastJsonConfig.setSerializeConfig(serializeConfig);
  75. // convert添加配置信息.
  76. fastConverter.setFastJsonConfig(fastJsonConfig);
  77. // 将convert添加到converters当中.
  78. converters.add(fastConverter);
  79. }
  80. }

3.2 类型序列化类

3.2.1 CustomDateSerializer

         自定义Date序列化类。

  1. package com.serializer;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.alibaba.fastjson.serializer.DateCodec;
  4. import com.alibaba.fastjson.serializer.JSONSerializer;
  5. import com.alibaba.fastjson.serializer.SerializeWriter;
  6. import java.io.IOException;
  7. import java.lang.reflect.Type;
  8. import java.util.Date;
  9. /**
  10. * 自定义Date序列化类
  11. */
  12. public class CustomDateSerializer extends DateCodec {
  13. /**
  14. * 序列化方法(重写)
  15. *
  16. * @param serializer
  17. * @param object
  18. * @param fieldName
  19. * @param fieldType
  20. * @param features
  21. * @throws IOException
  22. */
  23. public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
  24. SerializeWriter out = serializer.getWriter();
  25. if (object == null) {
  26. out.writeNull();
  27. return;
  28. }
  29. //指定日期格式
  30. out.writeString(DateUtil.format((Date) object, "yyyy-MM-dd HH:mm:ss"));
  31. return;
  32. }
  33. }

3.2.2 CustomCollectionSerializer

        自定义集合序列化类。

  1. package com.serializer;
  2. import com.alibaba.fastjson.serializer.*;
  3. import com.alibaba.fastjson.util.TypeUtils;
  4. import java.io.IOException;
  5. import java.lang.reflect.Type;
  6. import java.util.*;
  7. /**
  8. * 自定义集合序列化类
  9. */
  10. public class CustomCollectionSerializer extends CollectionCodec {
  11. /**
  12. * 序列化方法(重写)
  13. *
  14. * @param serializer
  15. * @param object
  16. * @param fieldName
  17. * @param fieldType
  18. * @param features
  19. * @throws IOException
  20. */
  21. public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
  22. SerializeWriter out = serializer.out;
  23. if (object == null) {
  24. out.writeNull(SerializerFeature.WriteNullListAsEmpty);
  25. return;
  26. }
  27. Type elementType = null;
  28. if (out.isEnabled(SerializerFeature.WriteClassName)
  29. || SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName)) {
  30. elementType = TypeUtils.getCollectionItemType(fieldType);
  31. }
  32. Collection<?> collection = (Collection<?>) object;
  33. SerialContext context = serializer.getContext();
  34. serializer.setContext(context, object, fieldName, 0);
  35. if (out.isEnabled(SerializerFeature.WriteClassName)) {
  36. if (HashSet.class == collection.getClass()) {
  37. out.append("Set");
  38. } else if (TreeSet.class == collection.getClass()) {
  39. out.append("TreeSet");
  40. }
  41. }
  42. try {
  43. int i = 0;
  44. out.append('[');
  45. for (Object item : collection) {
  46. if (i++ != 0) {
  47. out.append(',');
  48. }
  49. if (item == null) {
  50. out.writeNull();
  51. continue;
  52. }
  53. Class<?> clazz = item.getClass();
  54. ObjectSerializer itemSerializer = serializer.getObjectWriter(clazz);
  55. if (SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName)
  56. && itemSerializer instanceof JavaBeanSerializer) {
  57. JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) itemSerializer;
  58. javaBeanSerializer.writeNoneASM(serializer, item, i - 1, elementType, features);
  59. } else {
  60. itemSerializer.write(serializer, item, i - 1, elementType, features);
  61. }
  62. }
  63. out.append(']');
  64. } finally {
  65. serializer.setContext(context);
  66. }
  67. }
  68. }

3.3 调试代码

  1. package com.controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.List;
  7. @RestController
  8. public class JsonController {
  9. /**
  10. * 测试FastJson实现全局序列化配置
  11. *
  12. * @return
  13. */
  14. @GetMapping("/testFastJson")
  15. public List<Object> testFastJson() {
  16. List<Object> list = new ArrayList<>();
  17. list.add(1440931124753108994L);
  18. list.add(new Date());
  19. return list;
  20. }
  21. }

3.4 调试结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/923011
推荐阅读
相关标签
  

闽ICP备14008679号