A way to customize DateTimeFormatter in LocalDateDeserializer

728 views
Skip to first unread message

Max Posner

unread,
Nov 30, 2015, 2:14:48 PM11/30/15
to jackson-user

Hi! I have a problem: i have date string in specified format (yyyyMMdd), in my class i use 
LocalDate from java.time;

How i can change the default dateTimeFormatter in deserializer (without creation my custom deserializers extending from LocalDateDeserializer where i can override it)?
Thanks!

Max Posner

unread,
Nov 30, 2015, 2:14:48 PM11/30/15
to jackson-user

Tatu Saloranta

unread,
Nov 30, 2015, 3:06:24 PM11/30/15
to jackso...@googlegroups.com
Aside from possible global configuration, you should be able to use @JsonFormat annotation, something like:

    @JsonFormat(patern="yyyyMMdd")
    public LocalDate creationDate;

to specify format to use for both serialization and deserialization.

Specifying global DateFormat does not unfortunately work, as formatters between java.util.Date, Joda and Java 8 date/time are not interchangeable.

I think it is also possible to register deserializes that `jackson-datatype-jsr310` provides, but with alternate defaults. I have not done that myself but have seen examples of such usage (via improvements ideas to allow overriding). Perhaps someone can share their usage, if any.

-+ Tatu +-

ps. I have ideas of how to improve configurability significantly for 2.8, via per-type defaults for anything that is confgurable using @JsonFormat -- unfortunately this feature did not make it in 2.7



--
You received this message because you are subscribed to the Google Groups "jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jackson-user...@googlegroups.com.
To post to this group, send email to jackso...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

A. Rick Anderson

unread,
Sep 25, 2020, 12:35:29 PM9/25/20
to jackson-user
Define a customer DateTimeFormatter, then use the specific formatter that you want in defining a custom serializer/deserializer classes, both of which are really only one line of code each.

======================== Foo.java ==========================
package scratch;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

// My JSON Serializer/Deserializer classes
import json.MeetingDateDeserializer;
import json.MeetingDateSerializer;
import json.MeetingIDDeserializer;
import json.MeetingIDSerializer;
import json.MeetingShortDateDeserializer;
import json.MeetingShortDateSerializer;
import json.MeetingTitleDeserializer;
import json.MeetingTitleSerializer;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
static public final DateTimeFormatter meetingTitleFormatter     = DateTimeFormatter.ofPattern("dd MMMM yyyy");
   static public final DateTimeFormatter meetingIDFormatter        = DateTimeFormatter.ofPattern("yyyyMMdd");
   static public final DateTimeFormatter meetingDateFormatter      = DateTimeFormatter.ofPattern("yyyy-MM-dd");
   static public final DateTimeFormatter meetingShortDateFormatter = DateTimeFormatter.ofPattern("yyyy MMM dd");
   static public final DateTimeFormatter meetingLongDateFormatter  = DateTimeFormatter.ofPattern("yyyy MMMM dd");

   @JsonDeserialize(using = MeetingIDDeserializer.class)
   @JsonSerialize(using = MeetingIDSerializer.class)
   @JsonProperty("MeetingID")
   private LocalDate    meetingID;

   @JsonDeserialize(using = MeetingDateDeserializer.class)
   @JsonSerialize(using = MeetingDateSerializer.class)
   @JsonProperty("MeetingDate")
   private LocalDate    meetingDate;

   @JsonDeserialize(using = MeetingTitleDeserializer.class)
   @JsonSerialize(using = MeetingTitleSerializer.class)
   @JsonProperty("MeetingTitle")
   private LocalDate    meetingTitle;

   @JsonDeserialize(using = MeetingShortDateDeserializer.class)
   @JsonSerialize(using = MeetingShortDateSerializer.class)
   @JsonProperty("MeetingShortDate")
   private LocalDate    meetingShortDate;
....
======================== MeetingShortDateDeserializer.java =====================================
import static scratch.Foo.meetingShortDateFormatter;

import java.io.IOException;
import java.time.LocalDate;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class MeetingShortDateDeserializer extends StdDeserializer<LocalDate> {

   private static final long serialVersionUID = 1L;

   protected MeetingShortDateDeserializer() {
      super(LocalDate.class);
   }

   @Override
   public LocalDate deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
      return LocalDate.parse(jsonParser.readValueAs(String.class), meetingShortDateFormatter);
   }

========================= MeetingShortDateDeserializer.java ==================================
import static scratch.Foo.meetingShortDateFormatter;

import java.io.IOException;
import java.time.LocalDate;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class MeetingShortDateDeserializer extends StdDeserializer<LocalDate> {

   private static final long serialVersionUID = 1L;

   protected MeetingShortDateDeserializer() {
      super(LocalDate.class);
   }

   @Override
   public LocalDate deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
      return LocalDate.parse(jsonParser.readValueAs(String.class), meetingShortDateFormatter);
Reply all
Reply to author
Forward
0 new messages