您可以编写一个自定义 Jackson Serializer,然后必须在应用程序中进行注册。之后,该 dataType 的每次出现都将以这种方式序列化。即使要序列化的数据类型在另一个数据类型中。(就像你的例子)
注意:请容忍我不要为 LocalDateTime 编写它,因为我在我的应用程序中为 ZonedDateTime 编写了它。根据您的需要重写它对您来说应该不是一项艰巨的任务。
public class ZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime>
{
@Override
public void serialize( ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers ) throws IOException
{
gen.writeStartObject();
gen.writeFieldName( "timestamp" );
gen.writeString( Long.toString( value.toInstant().toEpochMilli() ) );
gen.writeFieldName( "offset" );
gen.writeString( value.getOffset().toString() );
gen.writeFieldName( "zone" );
gen.writeString( value.getZone().toString() );
gen.writeFieldName( "ts" );
gen.writeString( StringUtils.convertZonedDateTimeToISO8601String( value ) );
gen.writeEndObject();
}
}
然后像这样为 Jackson 的 ObjectMapper 注册它:
objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule( "MyModule" );
module.addSerializer( ZonedDateTime.class, new ZonedDateTimeSerializer() );
objectMapper.registerModule( module );
在这个过程中,我建议创建一个生产者( CDI ),它总是返回一个默认添加了这个序列化程序的 objectMapper。但我会把这项任务留给你去研究;)