2012-02-07 11 views
9

Estoy usando GSON para deserializar algunos JSON. El JSON es:GSON lanza el análisis de excepciones vacío Campo de fecha

{ 
    "employee_id": 297, 
    "surname": "Maynard", 
    "givenname": "Ron", 
    "lastlogin": "", 

...

El objeto Employee tiene un lastlogin campo Fecha:

public class Employee { 
private Integer employee_id; 

private String surname; 

private String givenname; 

private Date lastlogin; 

El problema que tengo es que cuando el valor lastlogin no se rellena, es una cadena vacía en el JSON, por lo que el analizador GSON lanza:

java.text.ParseException: Unparseable date: "" 
at java.text.DateFormat.parse(DateFormat.java:337) 
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79) 
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 

¿Qué es th? ¿De la manera habitual alrededor de esto?

Respuesta

30

Si no puede controlar la entrada (es decir, la parte que genera JSon) pero conoce el formato como debería cuando no está vacío, simplemente debe escribir un deserializador propio que pueda manejar valores vacíos, como p. Ej.

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
     @Override 
     public Date deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) 
       throws JsonParseException { 
      try { 
       return df.parse(json.getAsString()); 
      } catch (ParseException e) { 
       return null; 
      } 
     } 
    }); 
    Gson gson = gsonBuilder.create(); 

Ver https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserializ

2

Esto se debe a que es una cadena vacía, que Date no sabe cómo manejar. Si nos fijamos en el GSON Code, muestra que simplemente está analizando a ciegas la cadena utilizando DateFormat.parse, que no maneja bien las comillas.

¿Ha intentado utilizar null? Intenta usar null si está vacío. Desde el código para código GSON para DateTypeAdapter, maneja bien los objetos JSONNull, simplemente se salta sobre ellos.

Cuestiones relacionadas