setdateformat jsonsyntaxexception invalid google deserialize java date gson

jsonsyntaxexception - setdateformat java



GsonBuilder setDateFormat para "2011-10-26T20: 29: 59-07: 00" (4)

El -07:00 es la notación de zona horaria ISO 8601. Esto no es compatible con SimpleDateFormat hasta Java 7 . Entonces, si puede upgrade a Java 7, puede usar la X para representar la notación de zona horaria:

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

En Java 6 necesitarás hacer una coincidencia de patrón y reemplazarlo en la cadena JSON primero para reemplazar la parte -07:00 por la notación RFC 822 -0700 para que puedas usar Z :

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

o por la notación de zona horaria general GMT-07:00 para que pueda usar z :

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

2011-10-26T20:29:59-07:00 una fecha / hora en json como 2011-10-26T20:29:59-07:00 . ¿Cuál es la forma correcta de usar gsonBuilder.setDateFormat para formatear correctamente esta vez?


Ha pasado un tiempo desde que se publicó esta publicación, pero apareció al intentar usar GSON para analizar una respuesta de API que tenía este formato de fecha. Pensé que compartiría las 2 pequeñas funciones que escribí usando regex para encontrar todas las fechas y cambiarlas al formato que GSON puede luego analizar.

private static String cleanDateFormat(String json){ // takes in a string of JSON Pattern regex = Pattern.compile("//d//d://d//d://d//d[-//+]//d//d://d//d"); Matcher regexMatcher = regex.matcher(json); StringBuffer buff = new StringBuffer(); while(regexMatcher.find()){ regexMatcher.appendReplacement(buff, getSubOfMatch(regexMatcher)); } regexMatcher.appendTail(buff); return buff.toString(); } //then pull out the colon. private static String getSubOfMatch(Matcher matcher){ StringBuilder sb = new StringBuilder(matcher.group(0)); sb.deleteCharAt(sb.length()-3); return sb.toString(); }


Mi formato de fecha de respuesta de API es exactamente el mismo que el suyo, así:

"weather": { "temperature": 31, "time": "2016-06-23T09:28:38+08:00" }

en el proyecto de Android, utilizo el siguiente código, ambos funcionan para mí.

Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd''T''HH:mm:ssZ") .create(); // or, also work Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSSZ") .create();

"yyyy-MM-dd''T''HH:mm:ssX" no funciona en Android, aunque confié en usar Java 8 en build.gradle .

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

¿Cómo sabemos el formato de fecha que debemos establecer? De hecho, puede encontrar la respuesta del código fuente de SimpleDateFormat.java :

* <p>Which produces this output when run in the America/Los_Angeles time zone: * <pre> * yyyy-MM-dd 1969-12-31 * yyyy-MM-dd 1970-01-01 * yyyy-MM-dd HH:mm 1969-12-31 16:00 * yyyy-MM-dd HH:mm 1970-01-01 00:00 * yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800 * yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000 * yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800 * yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000 * yyyy-MM-dd''T''HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800 * yyyy-MM-dd''T''HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000 * </pre>


Para Java 8 (no se ha verificado para Java 7), solo usa el patrón

yyyy-MM-dd''T''HH:mm:ssXXX

Para obtener exactamente el formato de 2011-10-26T20:29:59-07:00 .

El patrón de zona horaria es de Java Date Time - Patrones personalizados de formato de fecha

  • X

    Zone offset Example: X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45