Force Milliseconds When Serializing Instant to ISO8601 using Jackson

前端 未结 5 641
野的像风
野的像风 2021-01-11 15:01

I have some questions related to JSON serialization using Jackson in a project where I use Spring Boot 2.0.0.M6, Spring Framework 5.0.1.R

5条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-11 15:38

    None of two workarounds mentioned by Sean Carroll works me. I end up with writing my own serializer for Instant.

    final ObjectMapper mapper = new ObjectMapper();
    final JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(Instant.class, new KeepMillisecondInstantSerializer());
    mapper.registerModule(javaTimeModule);
    
    public class KeepMillisecondInstantSerializer extends JsonSerializer {
    
        private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
                .withZone(ZoneId.of("UTC"));
    
        @Override
        public void serialize(final Instant instant, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException {
            final String serializedInstant = dateTimeFormatter.format(instant);
            jsonGenerator.writeString(serializedInstant);
        }
    }
    

    I guess Jackson use Instant.toString() method to serialize Instant objects by default. I also find some discussions about Instant.toString() method on StackOverflow.

提交回复
热议问题