Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add customization option for LocalDateTime handling of seconds and nanos #117

Open
steghio opened this issue Jul 5, 2019 · 0 comments
Open
Labels
date-time-config Work related to possible larger DateTimeConfig feature new-feature

Comments

@steghio
Copy link

steghio commented Jul 5, 2019

Hi all,

as seen in https://github.com/FasterXML/jackson-modules-java8/blob/master/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateTimeSerializer.java method _serializeAsArrayContents line 112, if seconds or nanos are set to 0 in the LocalDateTime object being serialized, they will NOT be included into the resulting JSON.

I understand this might be trying to follow what its toString https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#toString does, but it is not convenient when senders and receivers either do not understand the LocalDateTime specification or are unable to handle it properly.

Please add a customization option to allow sending seconds and nanos even when set to 0, the only current workaround is to implement a custom serializer and add it to a custom mapper to be passed in whatever configuration needs it, which is not really convenient:

public static class LocalDateTimeWithSecondsSerializer extends StdSerializer<LocalDateTime> {

        public LocalDateTimeWithSecondsSerializer() {
            super(LocalDateTime.class);
        }

        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeStartArray();
            gen.writeNumber(value.getYear());
            gen.writeNumber(value.getMonthValue());
            gen.writeNumber(value.getDayOfMonth());
            gen.writeNumber(value.getHour());
            gen.writeNumber(value.getMinute());
            gen.writeNumber(value.getSecond());
            gen.writeEndArray();
        }
    }

public static class CustomEntityMapper implements EntityMapper {

        private final ObjectMapper objectMapper;

        public CustomEntityMapper() {

            SimpleModule localDateTimeWithSecondsSerializerModule = new SimpleModule();
            localDateTimeWithSecondsSerializerModule.addSerializer(new LocalDateTimeWithSecondsSerializer());

            objectMapper = new ObjectMapper()
                              .registerModule(new JavaTimeModule())
                              .registerModule(localDateTimeWithSecondsSerializerModule)
                              .registerModule(new Jdk8Module());

            objectMapper.findAndRegisterModules();
        }

        @Override
        public String mapToString(Object object) throws IOException {
            return objectMapper.writeValueAsString(object);
        }

        @Override
        public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
            return objectMapper.readValue(source, clazz);
        }
    }

Thanks and cheers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
date-time-config Work related to possible larger DateTimeConfig feature new-feature
Projects
None yet
Development

No branches or pull requests

2 participants