FastJson是阿里巴巴提供的一款Json格式化插件。

ApiBoot提供了FastJson驱动转换接口请求的Json字符串数据,添加该依赖后会自动格式化时间(格式:YYYY-MM-DD HH:mm:ss)、空对象转换为空字符串返回、空Number转换为0等,还会自动装载ValueFilter接口的实现类来完成自定义的数据格式转换。

引入Http Converter

ApiBoot Http Converter使用非常简单,只需要在pom.xml添加如下依赖:

  1. <!--ApiBoot Http Converter-->
  2. <dependency>
  3. <groupId>org.minbox.framework</groupId>
  4. <artifactId>api-boot-starter-http-converter</artifactId>
  5. </dependency>

如果对ApiBoot使用不了解,可查看快速接入ApiBoot

相关配置

ApiBoot Http Converter通过使用SpringBoot内置的配置参数名来确定是否开启,在SpringBoot内可以通过spring.http.converters.preferred-json-mapper来修改首选的Json格式化插件,SpringBoot已经提供了三种,分别是:gsonjacksonjsonb,当我们配置该参数为fastJson不进行配置就会使用ApiBoot Http Converter提供的fastJson来格式化转换Json返回数据。

如下所示:

  1. spring:
  2. http:
  3. converters:
  4. # 不配置默认使用fastJson
  5. preferred-json-mapper: fastJson

内置ValueFilter注解

注解名称ValueFilter实现类作用
@ApiBootValueHideValueHideFilter用于格式化隐藏标注的字符串字段的值
@ApiBootDecimalAccuracyDecimalAccuracyFilter用于格式化BigDecimal类型字段的精度、小数点位数等

@ApiBootValueHide

可配置参数:

  • length:隐藏的字节长度
  • start:开始隐藏的字节索引位置
  • position:位置类型,具体查看ValueHidePositionEnum枚举
  • placeholder:隐藏后被替换的字符,默认为:*

@ApiBootDecimalAccuracy

可配置参数:

  • scale:小数点位数,默认为2
  • roundingMode:小数点精度模式,默认为BigDecimal.ROUND_DOWN,具体查看BigDecimal的rounding mode

自定义ValueFilter

ValueFilterFastJson的概念,用于自定义转换实现,比如:自定义格式化日期、自动截取小数点等。

下面提供一个ValueFilter的简单示例,具体的使用请参考FastJson官方文档。

ValueFilter示例

在使用ValueFilter时一般都会搭配一个对应的自定义@Annotation来进行组合使用,保留自定义小数点位数的示例如下所示:

创建 BigDecimalFormatter Annotation

  1. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface BigDecimalFormatter {
  4. /**
  5. * 小数位数,默认保留两位
  6. * @return
  7. */
  8. int scale() default 2;
  9. }

创建 BigDecimal ValueFilter

  1. public class BigDecimalValueFilter
  2. implements ValueFilter {
  3. /**
  4. * logback
  5. */
  6. Logger logger = LoggerFactory.getLogger(BigDecimalValueFilter.class);
  7. /**
  8. * @param object 对象
  9. * @param name 对象的字段的名称
  10. * @param value 对象的字段的值
  11. */
  12. @Override
  13. public Object process(Object object, String name, Object value) {
  14. if (ValidateTools.isEmpty(value) || !(value instanceof BigDecimal)) {
  15. return value;
  16. }
  17. return convertValue(object, name, value);
  18. }
  19. /**
  20. * 转换值
  21. *
  22. * @param object 字段所属对象实例
  23. * @param name 字段名称
  24. * @param value 字段的值
  25. * @return
  26. */
  27. Object convertValue(Object object, String name, Object value) {
  28. try {
  29. /**
  30. * 反射获取field
  31. */
  32. Field field = object.getClass().getDeclaredField(name);
  33. /**
  34. *判断字段是否存在@BigDecimalFormatter注解
  35. */
  36. if (field.isAnnotationPresent(BigDecimalFormatter.class)) {
  37. BigDecimalFormatter bigDecimalFormatter = field.getAnnotation(BigDecimalFormatter.class);
  38. // 执行格式化
  39. BigDecimal decimal = (BigDecimal) value;
  40. System.out.println(bigDecimalFormatter.scale());
  41. // 保留小数位数,删除多余
  42. value = decimal.setScale(bigDecimalFormatter.scale(), BigDecimal.ROUND_DOWN).doubleValue();
  43. }
  44. } catch (Exception e) {
  45. logger.error("格式化BigDecimal字段出现异常:{}", e.getMessage());
  46. }
  47. return value;
  48. }
  49. }

使用 BigDecimalFormatter Annotation

  1. @BigDecimalFormatter
  2. private BigDecimal decimalValue;