我正在使用jackson-datatype-jsr310 310模块,它支持LocalDateTime序列化。但默认情况下,它将日期/时间序列化为"2022,6,29,17,15,54“。
但是,我需要重写这个行为,以便以"Calendar“格式(例如)序列化/反序列化它。作为json对象
"arrivalDate": {
"month": "JUNE",
"dayOfWeek": "WEDNESDAY",
"dayOfYear": 180,
"nano": 0,
"year": 2022,
"monthValue": 6,
"dayOfMonth": 29,
"hour": 12,
"minute": 53,
"second": 46,
"chronology": {
"id": "ISO",
"calendarType": "iso8601"
}
}对于所有应用程序,该设置不应该是全局的,而仅用于内部特定的ObjectMapper实例化。
发布于 2022-07-01 05:50:03
引言
让我们把Jackson 2.13.3作为当前版本。
分析
这样的特征似乎已被排除在外。
请参阅下面的源代码,并注意下面的注释:jackson-databind/BeanSerializerFactory.java at jackson-databind-2.13.3·FasterXML/jackson-databind
protected JsonSerializer<?> _findUnsupportedTypeSerializer(SerializerProvider ctxt,
JavaType type, BeanDescription beanDesc)
throws JsonMappingException
{
// 05-May-2020, tatu: Should we check for possible Shape override to "POJO"?
// (to let users force 'serialize-as-POJO'?
final String errorMsg = BeanUtil.checkUnsupportedType(type);也许,打开适当的GitHub问题是值得的。
可能的解决办法
引入并使用自定义BeanSerializerFactory实现,该实现不会阻止对JSR 310类型( java.time包)和Joda类型( org.joda.time包)使用默认的Jackson序列化程序。
为了理解这个想法,请参考以下方法的实施:
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"}}}附加参考资料
- Comment: [Spring Boot 2.5.0 and InvalidDefinitionException: Java 8 date/time type `java.time.Instant` not supported by default · Issue #26859 · spring-projects/spring-boot](https://github.com/spring-projects/spring-boot/issues/26859#issuecomment-869144674).https://stackoverflow.com/questions/72804142
复制相似问题