简介
让我们将 Jackson 2.13.3 视为当前版本。
可能的解决方法
引入并使用自定义的 BeanSerializerFactory 实现,该实现不会阻止对 JSR 310 类型(java.time 包)和 Joda 类型(org.joda.time 包)使用默认的 Jackson bean 序列化程序。
要理解这个想法,请参考方法的实现:
-
com.fasterxml.jackson.databind.ser.BeanSerializerFactory._findUnsupportedTypeSerializer()。
-
com.fasterxml.jackson.databind.util.BeanUtil.checkUnsupportedType()。
com.fasterxml.jackson.databind.util.BeanUtil.isJava8TimeClass()
CustomBeanSerializerFactory类
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.cfg.SerializerFactoryConfig;
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
public final class CustomBeanSerializerFactory extends BeanSerializerFactory {
protected CustomBeanSerializerFactory(final SerializerFactoryConfig config) {
super(config);
}
@Override
protected JsonSerializer<?> _findUnsupportedTypeSerializer(
final SerializerProvider ctxt,
final JavaType type,
final BeanDescription beanDesc
) {
return null;
}
}
Schedule类
import java.time.LocalDateTime;
public final class Schedule {
private final LocalDateTime arrivalDate;
public Schedule(final LocalDateTime arrivalDate) {
this.arrivalDate = arrivalDate;
}
public LocalDateTime getArrivalDate() {
return arrivalDate;
}
}
Program类
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.LocalDateTime;
public final class Program {
public static void main(final String[] args) throws JsonProcessingException {
final LocalDateTime localDateTime = LocalDateTime.of(
2022, 1, 2, 3, 4, 5, 6
);
final Schedule schedule = new Schedule(localDateTime);
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializerFactory(
new CustomBeanSerializerFactory(null)
);
final String jsonString = objectMapper.writeValueAsString(schedule);
System.out.println(jsonString);
}
}
程序输出:
{"arrivalDate":{"nano":6,"year":2022,"monthValue":1,"dayOfMonth":2,"hour":3,"minute":4,"second":5,"month":"JANUARY","dayOfWeek":"SUNDAY","dayOfYear":2,"chronology":{"id":"ISO","calendarType":"iso8601"}}}
其他参考