How to serialize Joda DateTime with Jackson JSON processor? How to serialize Joda DateTime with Jackson JSON processor? java java

How to serialize Joda DateTime with Jackson JSON processor?


This has become very easy with Jackson 2.0 and the Joda module.

ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new JodaModule());

Maven dependency:

<dependency>  <groupId>com.fasterxml.jackson.datatype</groupId>  <artifactId>jackson-datatype-joda</artifactId>  <version>2.1.1</version></dependency>  

Code and documentation:https://github.com/FasterXML/jackson-datatype-joda

Binaries:http://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-joda/


In the object you're mapping:

@JsonSerialize(using = CustomDateSerializer.class)public DateTime getDate() { ... }

In CustomDateSerializer:

public class CustomDateSerializer extends JsonSerializer<DateTime> {    private static DateTimeFormatter formatter =         DateTimeFormat.forPattern("dd-MM-yyyy");    @Override    public void serialize(DateTime value, JsonGenerator gen,                           SerializerProvider arg2)        throws IOException, JsonProcessingException {        gen.writeString(formatter.print(value));    }}


As @Kimble has said, with Jackson 2, using the default formatting is very easy; simply register JodaModule on your ObjectMapper.

ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new JodaModule());

For custom serialization/de-serialization of DateTime, you need to implement your own StdScalarSerializer and StdScalarDeserializer; it's pretty convoluted, but anyway.

For example, here's a DateTime serializer that uses the ISODateFormat with the UTC time zone:

public class DateTimeSerializer extends StdScalarSerializer<DateTime> {    public DateTimeSerializer() {        super(DateTime.class);    }    @Override    public void serialize(DateTime dateTime,                          JsonGenerator jsonGenerator,                          SerializerProvider provider) throws IOException, JsonGenerationException {        String dateTimeAsString = ISODateTimeFormat.withZoneUTC().print(dateTime);        jsonGenerator.writeString(dateTimeAsString);    }}

And the corresponding de-serializer:

public class DateTimeDesrializer extends StdScalarDeserializer<DateTime> {    public DateTimeDesrializer() {        super(DateTime.class);    }    @Override    public DateTime deserialize(JsonParser jsonParser,                                DeserializationContext deserializationContext) throws IOException, JsonProcessingException {        try {            JsonToken currentToken = jsonParser.getCurrentToken();            if (currentToken == JsonToken.VALUE_STRING) {                String dateTimeAsString = jsonParser.getText().trim();                return ISODateTimeFormat.withZoneUTC().parseDateTime(dateTimeAsString);            }        } finally {            throw deserializationContext.mappingException(getValueClass());        }    }

Then tie these together with a module:

public class DateTimeModule extends SimpleModule {    public DateTimeModule() {        super();        addSerializer(DateTime.class, new DateTimeSerializer());        addDeserializer(DateTime.class, new DateTimeDeserializer());    }}

Then register the module on your ObjectMapper:

ObjectMapper mapper = new ObjectMapper();mapper.registerModule(new DateTimeModule());