gson fails to parse using GsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")

21,823

Only setting the required DateFormat is not sufficient.

You need to define an implementation of com.google.gson.JsonDeserializer. For ex.

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

public class DateDeserializer implements JsonDeserializer<Date> {

  @Override
  public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
      String date = element.getAsString();

      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
      format.setTimeZone(TimeZone.getTimeZone("GMT"));

      try {
          return format.parse(date);
      } catch (ParseException exp) {
          System.err.println("Failed to parse Date:", exp);
          return null;
      }
   }
}

and then register the above deserializer:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
Share:
21,823
Elad Benda2
Author by

Elad Benda2

Updated on March 21, 2020

Comments

  • Elad Benda2
    Elad Benda2 about 4 years

    I get this string from the server:

    [
     {
      "title":"spoil the ones u love today",
      "startDateTime":"2014-08-10T20:10:36.7158Z"
     },
     {
      "title":"home made patisserie",
      "startDateTime":"2014-08-10T20:08:45.0218Z"
     }
    ]
    

    and I try to parse it an object

        public class Offer implements Serializable {
            public String title;
            public Date startDateTime;
        }
    
    Type collectionType = new TypeToken<ArrayList<Offer>>() {}.getType();
    
    mOffersList.addAll((Collection<? extends Offer>) gson.fromJson(result, collectionType));
    

    but when I define "startDate" as a Date

    the collection I get back from gson is empty

    When i define "startDate" as a String

    the collection is filled correctly.

    I want to change its date format. That's why I prefer saving it as a Date object.

    I have tried

    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create;

    and yet Gson fails to parse the server's string into

    Date startDateTime. Nothing is added to the mOffersList and it stays empty.

    What am I doing wrong?