2011-08-23 12 views
7

Estoy intentando serializar/deserializar JSON en Android usando GSON. Tengo dos clases que se ven así:GSON Deserializing Array of Custom Objects

public class Session { 
@SerializedName("name") 
private String _name; 
@SerializedName("users") 
private ArrayList<User> _users = new ArrayList<User>(); 
} 

y:

public class User { 
@SerializedName("name") 
private String _name; 
@SerializedName("role") 
private int _role; 
} 

que estoy usando GSON para serializar/deserializar los datos. Me serializar este modo:

Gson gson = new Gson(); 
String sessionJson = gson.toJson(session); 

Esto producirá JSON que tiene este aspecto:

{ 
"name":"hi", 
    "users": 
[{"name":"John","role":2}] 
} 

Y Deserialize así:

Gson gson = new Gson(); 
Session session = gson.fromJson(jsonString, Session.class); 

Recibo un error cuando hago esta llamada.

DEBUG/dalvikvm(739): wrong object type: Ljava/util/LinkedList; Ljava/util/ArrayList; 
WARN/System.err(739): java.lang.IllegalArgumentException: invalid value for field 

No sé lo que significa este error. No me veo haciendo nada gravemente incorrecto. ¿Alguna ayuda? ¡Gracias!

+1

El problema parece desaparecer cuando cambio la lista de usuarios en la clase Session de una ArrayList a una lista. ¿Debería causar esto un problema para GSON? –

Respuesta

11

cambiar el código para esto:

public class Session { 
    @SerializedName("name") 
    private String _name; 
    @SerializedName("users") 
    private List<User> _users = new ArrayList<User>(); 
    } 

Es una buena práctica utilizar interfaces, y GSON requiere que (al menos, sin necesidad de configuración adicional).

Gson convierte la matriz "[]" en javascript en un objeto LinkedList.

En su código, GSON intenta inyectar una LinkedList en el campo _users, pensando que ese campo es una lista.