使用jsonSerializer转换时间

 

碰到业务需求返回的时间格式不一致,比如

返回要求时间戳

image.png

而我们后端返回的可能是 14901771219000 多了三个零 是因为后端数据精确到了毫秒


这时我们可以使用jsonSerializer类来实现转换

创建serializer包
定义一个Date2LongSerializer类 继承 jsonserializer<date> 这里要转换的类型是date

/**
*author huangh
*date 2018/8/17 15:12
*description 时间转换
*/
public class Date2LongSerializer extends JsonSerializer<Date> {

  @Override
  public void serialize(Date date, JsonGenerator jsonGenerator,
      SerializerProvider serializerProvider) throws IOException {
    jsonGenerator.writeNumber(date.getTime()/1000);
  }
}

然后在传输对象中 把对应的时间属性加上注解

  //使用我们定义的类来转换,参数就是被注解的属性
  @JsonSerialize(using = Date2LongSerializer.class)
  private Date createTime;

  @JsonSerialize(using = Date2LongSerializer.class)
  private Date updateTime;

在开发的时候 我们还会遇到 把一些null的不必要的属性也跟着反回给前端了
也可以在application文件中添加全局配置


/**
*author huangh
*date 2018/8/14 11:55
*description 创建订单传输对象
*/
@Data
//加入这个注解就可以把一些属性为null的排除掉
@JsonInclude(Include.NON_NULL)
public class OrderDto {
  /**订单表*/
  private String orderId;
  private String buyerName;
  private String buyerPhone;
  private String buyerAddress;

   #如果返回的属性值是null 则不返回null
  jackson:
    default-property-inclusion: non_null
    
<think>好的,我需要回答用户关于Jackson中SerializerProvider的使用方法和常见问题解决。首先,我需要回忆SerializerProvider的作用。SerializerProvider是Jackson的核心组件之一,主要用于管理序列化过程中的上下文信息,比如配置、过滤器、类型处理等。用户可能在使用自定义序列化器或处理特定类型时遇到问题,需要了解如何正确使用它。 接下来,我需要查阅相关的知识。根据用户提供的引用内容,引用[2]提到了ObjectMapper使用反射进行字段映射,而引用[3]涉及时间格式的处理,这可能与SerializerProvider在序列化时的配置有关。SerializerProvider通常用于自定义序列化器中,比如在JsonSerializer的serialize方法中,可以通过SerializerProvider获取当前的配置信息,如日期格式、时区等。 用户可能遇到的问题包括如何访问当前序列化配置、如何处理空值、如何动态修改属性等。例如,在自定义序列化器中,如果需要根据全局配置来决定日期格式,就需要通过SerializerProvider来获取这些配置。此外,处理空值时,可能需要使用Provider的默认值设置。 另外,常见的问题可能涉及循环引用、类型识别或自定义过滤器的应用,这些都需要通过SerializerProvider来管理上下文。例如,在序列化过程中避免无限递归,可以通过SerializerProvider中的特性配置来解决。 需要注意,用户可能对如何在实际代码中使用SerializerProvider不太清楚,因此需要提供具体的代码示例,比如在自定义序列化器中重写serialize方法,展示如何通过provider获取配置或处理空值。同时,常见问题部分需要列举典型场景及解决方法,比如日期格式化、空值处理、动态忽略字段等,并引用相关的参考资料,如引用[3]中的时间格式处理。 最后,确保回答结构清晰,分点说明使用方法和常见问题,每个部分都结合示例代码和引用来源,确保用户能够逐步理解和应用SerializerProvider的相关知识。</think>### SerializerProvider 使用方法与常见问题解决 #### 一、SerializerProvider 核心作用 `SerializerProvider` 是 Jackson 序列化过程中的上下文管理器,负责提供序列化配置、类型处理、过滤器、空值处理等核心功能。在自定义序列化器(`JsonSerializer`)中通过 `serialize()` 方法参数访问该对象。 #### 二、典型使用场景 ##### 1. 获取全局配置信息 通过 `SerializerProvider` 获取 ObjectMapper 的全局配置(如日期格式、时区)。 ```java public class CustomDateSerializer extends JsonSerializer<Date> { @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException { DateFormat df = provider.getConfig().getDateFormat(); gen.writeString(df.format(value)); // 使用全局配置的日期格式[^3] } } ``` ##### 2. 空值处理 使用 `provider.defaultSerializeNull(gen)` 应用全局空值序列化策略。 ```java public class CustomSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { if (value == null) { provider.defaultSerializeNull(gen); // 输出为 null 或按配置忽略 return; } gen.writeString(value.toString()); } } ``` ##### 3. 动态属性过滤 通过 `provider.getAttribute()` 获取运行时参数,动态控制字段输出。 ```java provider.getAttribute("dynamicFilter").shouldInclude(fieldName); ``` #### 三、常见问题解决 ##### 1. 日期格式不一致 **问题**:局部序列化器覆盖全局配置。 **解决**:在自定义序列化器中主动读取全局配置: ```java // 使用 provider 获取 ObjectMapper 的日期格式 DateFormat globalFormat = provider.getConfig().getDateFormat(); ``` ##### 2. 循环引用导致栈溢出 **问题**:对象间相互引用引发无限递归。 **解决**:通过 `provider.setAttribute()` 标记已处理对象: ```java provider.setAttribute("visited", Collections.singleton(value)); if (provider.getAttribute("visited").contains(value)) { gen.writeNull(); // 终止递归 return; } ``` ##### 3. 动态忽略字段 **场景**:根据请求参数动态隐藏敏感字段。 **实现**: ```java ObjectMapper mapper = new ObjectMapper() .setFilterProvider(new SimpleFilterProvider().addFilter("dynamicFilter", SimpleBeanPropertyFilter.serializeAllExcept("password"))); // 在序列化器中访问过滤器 PropertyFilter filter = provider.getFilterProvider().findFilter("dynamicFilter"); ``` #### 四、代码示例(时间格式化) ```java public class CustomDateTimeSerializer extends JsonSerializer<LocalDateTime> { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException { DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; // 默认格式 if (provider.getConfig().hasSerializationFeatures(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)) { formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 覆盖配置 } gen.writeString(formatter.format(value)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值