jsonsyntaxexception google deserialize java json date gson utc

google - Fecha de Java a UTC usando gson



gson date format (4)

Después de algunas investigaciones adicionales, parece que este es un problema conocido. El serializador predeterminado gson siempre se establece de manera predeterminada en su zona horaria local, y no le permite especificar la zona horaria. Ver el siguiente enlace .....

https://code.google.com/p/google-gson/issues/detail?id=281

La solución es crear un adaptador tipo gson personalizado como se demuestra en el enlace:

// this class can''t be static public class GsonUTCDateAdapter implements JsonSerializer<Date>,JsonDeserializer<Date> { private final DateFormat dateFormat; public GsonUTCDateAdapter() { dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSS''Z''", Locale.US); //This is the format I need dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); //This is the key line which converts the date to UTC which cannot be accessed with the default serializer } @Override public synchronized JsonElement serialize(Date date,Type type,JsonSerializationContext jsonSerializationContext) { return new JsonPrimitive(dateFormat.format(date)); } @Override public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) { try { return dateFormat.parse(jsonElement.getAsString()); } catch (ParseException e) { throw new JsonParseException(e); } } }

Luego regístrelo de la siguiente manera:

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new GsonUTCDateAdapter()).create(); Date now=new Date(); System.out.println(gson.toJson(now));

Esto ahora muestra correctamente la fecha en UTC

"2014-09-25T17:21:42.026Z"

Gracias al autor del enlace.

Parece que no puedo hacer que gson convierta una fecha a hora UTC en Java ... Aquí está mi código ...

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSS''Z''").create(); //This is the format I want, which according to the ISO8601 standard - Z specifies UTC - ''Zulu'' time Date now=new Date(); System.out.println(now); System.out.println(now.getTimezoneOffset()); System.out.println(gson.toJson(now));

Aquí está mi Salida

Thu Sep 25 18:21:42 BST 2014 // Time now - in British Summer Time -60 // As expected : offset is 1hour from UTC "2014-09-25T18:21:42.026Z" // Uhhhh this is not UTC ??? Its still BST !!

El resultado más simple que quiero y lo que esperaba

"2014-09-25T17:21:42.026Z"

Claramente puedo restar 1 hora antes de llamar a Json, pero parece ser un truco. ¿Cómo puedo configurar gson para convertir siempre a UTC?


La Z en su formato de fecha está entre comillas simples, debe ser sin comillas para ser reemplazada por la zona horaria real.

Además, si quiere su fecha en UTC, conviértalo primero.


La solución que funcionó para mí para este problema fue crear un adaptador de fecha personalizado (PD tenga cuidado para que importes java.util.Date no java.sql.Date !)

public class ColonCompatibileDateTypeAdapter implements JsonSerializer<Date>, JsonDeserializer< Date> { private final DateFormat dateFormat; public ColonCompatibileDateTypeAdapter() { dateFormat = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSSZ") { @Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) { StringBuffer rfcFormat = super.format(date, toAppendTo, pos); return rfcFormat.insert(rfcFormat.length() - 2, ":"); } @Override public Date parse(String text, ParsePosition pos) { if (text.length() > 3) { text = text.substring(0, text.length() - 3) + text.substring(text.length() - 2); } return super.parse(text, pos); } }; } @Override public synchronized JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) { return new JsonPrimitive(dateFormat.format(date)); } @Override public synchronized Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) { try { return dateFormat.parse(jsonElement.getAsString()); } catch (ParseException e) { throw new JsonParseException(e); } }}

y luego usarlo al crear el objeto GSON

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new ColonCompatibileDateTypeAdapter()).create();


DateFormat la solution marcada y parametrice el DateFormat :

import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import java.lang.reflect.Type; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; public class GsonDateFormatAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> { private final DateFormat dateFormat; public GsonDateFormatAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; } @Override public synchronized JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) { return new JsonPrimitive(dateFormat.format(date)); } @Override public synchronized Date deserialize(JsonElement jsonElement, Type type,JsonDeserializationContext jsonDeserializationContext) { try { return dateFormat.parse(jsonElement.getAsString()); } catch (ParseException e) { throw new JsonParseException(e); } } }