1 package com.fasterxml.jackson.datatype.jsr310.ser.key;
2
3 import java.io.IOException;
4 import java.time.ZonedDateTime;
5 import java.time.format.DateTimeFormatter;
6
7 import com.fasterxml.jackson.core.JsonGenerator;
8 import com.fasterxml.jackson.core.JsonProcessingException;
9 import com.fasterxml.jackson.databind.JsonSerializer;
10 import com.fasterxml.jackson.databind.SerializationFeature;
11 import com.fasterxml.jackson.databind.SerializerProvider;
12 import com.fasterxml.jackson.datatype.jsr310.DecimalUtils;
13
14 public class ZonedDateTimeKeySerializer extends JsonSerializer<ZonedDateTime> {
15
16     public static final ZonedDateTimeKeySerializer INSTANCE = new ZonedDateTimeKeySerializer();
17
18     private ZonedDateTimeKeySerializer() {
19         // singleton
20     }
21
22     @Override
23     public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException,
24         JsonProcessingException {
25         /* [modules-java8#127]: Serialization of timezone data is disabled by default, but can be
26          * turned on by enabling `SerializationFeature.WRITE_DATES_WITH_ZONE_ID`
27          */

28         if (serializers.isEnabled(SerializationFeature.WRITE_DATES_WITH_ZONE_ID)) {
29             gen.writeFieldName(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(value));
30         } else if (useTimestamps(serializers)) {
31             if (useNanos(serializers)) {
32                 gen.writeFieldName(DecimalUtils.toBigDecimal(value.toEpochSecond(), value.getNano()).toString());
33             } else {
34                 gen.writeFieldName(String.valueOf(value.toInstant().toEpochMilli()));
35             }
36         } else {
37             gen.writeFieldName(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(value));
38         }
39     }
40
41     private static boolean useNanos(SerializerProvider serializers) {
42         return serializers.isEnabled(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
43     }
44
45     private static boolean useTimestamps(SerializerProvider serializers) {
46         return serializers.isEnabled(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
47     }
48
49 }
50