前言

  • 在前后端分离开发模式下,接口规范统一处理Boolean类型,需要转成0和1,使用SpringBoot + fastjson全局统一配置,具体配置如下

    配置自定义序列化规则

    自定义序列化

  • 自定义BooleanToIntegerSerializer实现ObjectSerializer接口方法 ```shell package com.jyusun.origin.common.config.fastjson;

import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.SerializeWriter; import com.jyusun.origin.common.util.ObjectUtil;

import java.io.IOException; import java.lang.reflect.Type;

/**

  • 布尔类型序列化 false=0,true=1
  • 作用描述: *
  • @author jyusun
  • @date 2021/12/1 15:50
  • @since 1.0.0 */ public class BooleanToIntegerSerializer implements ObjectSerializer {
  1. @Override
  2. public void write(JSONSerializer jsonSerializer, Object object, Object o1, Type type, int i) throws IOException {
  3. SerializeWriter out = jsonSerializer.getWriter();
  4. int value;
  5. if (ObjectUtil.isEmpty(object)) {
  6. value = 0;
  7. } else {
  8. value = Boolean.parseBoolean(String.valueOf(object)) ? 1 : 0;
  9. }
  10. out.writeInt(value);
  11. }

}

  1. <a name="rUyUt"></a>
  2. ### 方式一:FastJsonConfiguration
  3. - 配置自定义的序列化代码`fastJsonConfig.getSerializeConfig().put(Boolean.class, new BooleanToIntegerSerializer());`
  4. ```shell
  5. package com.jyusun.origin.basic.common.config.fastjson;
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.parser.ParserConfig;
  8. import com.alibaba.fastjson.serializer.SerializerFeature;
  9. import com.alibaba.fastjson.support.config.FastJsonConfig;
  10. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  11. import com.clamc.common.util.DateUtil;
  12. import com.google.common.collect.Lists;
  13. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  14. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  15. import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.http.MediaType;
  19. import java.nio.charset.Charset;
  20. import java.time.LocalDate;
  21. import java.time.LocalDateTime;
  22. import java.time.LocalTime;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. /**
  26. * FastJson 配置类
  27. *
  28. * @author jyusun
  29. * @since 1.0.0
  30. */
  31. @Configuration
  32. @ConditionalOnClass(JSON.class)
  33. @ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
  34. @ConditionalOnWebApplication
  35. public class FastJsonConfiguration {
  36. @Bean
  37. public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
  38. FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
  39. converter.setFastJsonConfig(fastJsonConfig());
  40. converter.setSupportedMediaTypes(getSupportedMediaType());
  41. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  42. return converter;
  43. }
  44. /**
  45. * fastJson的配置
  46. */
  47. private FastJsonConfig fastJsonConfig() {
  48. FastJsonConfig fastJsonConfig = new FastJsonConfig();
  49. fastJsonConfig.setSerializerFeatures(
  50. SerializerFeature.PrettyFormat,
  51. // Map 默认值
  52. SerializerFeature.WriteMapNullValue,
  53. // 数组 默认 空数组
  54. SerializerFeature.WriteNullListAsEmpty,
  55. // 数值类型 默认为 0
  56. SerializerFeature.WriteNullNumberAsZero,
  57. // Boolean 默认为 false
  58. SerializerFeature.WriteNullBooleanAsFalse,
  59. SerializerFeature.WriteDateUseDateFormat,
  60. // 消除循环引用
  61. SerializerFeature.DisableCircularReferenceDetect,
  62. // 字段名称排序后输出
  63. SerializerFeature.SortField
  64. );
  65. fastJsonConfig.setDateFormat(DateUtil.PATTERN_YYYY_MM_DD_HH_MM_SS);
  66. fastJsonConfig.setCharset(Charset.forName("utf-8"));
  67. // 自定义Boolean类型序列化配置
  68. fastJsonConfig.getSerializeConfig().put(Boolean.class, new BooleanToIntegerSerializer());
  69. return fastJsonConfig;
  70. }
  71. /**
  72. * 支持的mediaType类型
  73. */
  74. private List<MediaType> getSupportedMediaType() {
  75. ArrayList<MediaType> mediaTypes = Lists.newArrayList();
  76. mediaTypes.add(MediaType.APPLICATION_JSON);
  77. mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
  78. mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
  79. mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
  80. mediaTypes.add(MediaType.APPLICATION_PDF);
  81. mediaTypes.add(MediaType.APPLICATION_RSS_XML);
  82. mediaTypes.add(MediaType.APPLICATION_XHTML_XML);
  83. mediaTypes.add(MediaType.APPLICATION_XML);
  84. mediaTypes.add(MediaType.IMAGE_GIF);
  85. mediaTypes.add(MediaType.IMAGE_JPEG);
  86. mediaTypes.add(MediaType.IMAGE_PNG);
  87. mediaTypes.add(MediaType.TEXT_EVENT_STREAM);
  88. mediaTypes.add(MediaType.TEXT_HTML);
  89. mediaTypes.add(MediaType.TEXT_MARKDOWN);
  90. mediaTypes.add(MediaType.TEXT_PLAIN);
  91. mediaTypes.add(MediaType.TEXT_XML);
  92. //增加解析spring boot actuator结果的解析
  93. mediaTypes.add(MediaType.valueOf("application/vnd.spring-boot.actuator.v2+json"));
  94. return mediaTypes;
  95. }
  96. }

运行结果

  1. {
  2. "code": "S00200",
  3. "message": "操作成功",
  4. "sign": 1,
  5. "body": {}
  6. }

image.png