2010-12-06 24 views
13

Estoy usando GSON 1.4 y serializando un objeto con dos genéricos arraylist<myObject> de la siguiente manera String data = Gson.toJson(object, object.class). Cuando desirialize que hago gson.fromJson(json, type);genéricos deserializantes con gson

tristemente consigo

java.lang.IllegalArgumentException: No se puede establecer java.util.ArrayList campo ... a java.util.LinkedList

¿Por qué es eso? El documento GSON señala que si serializo con el parámetro object.class, admite genéricos. ¿alguna idea? Gracias.

mi clase es:

public class IndicesAndWeightsParams { 

    public List<IndexParams> indicesParams; 
    public List<WeightParams> weightsParams; 

    public IndicesAndWeightsParams() { 
     indicesParams = new ArrayList<IndexParams>(); 
     weightsParams = new ArrayList<WeightParams>(); 
    } 
    public IndicesAndWeightsParams(ArrayList<IndexParams> indicesParams, ArrayList<WeightParams> weightsParams) { 
     this.indicesParams = indicesParams; 
     this.weightsParams = weightsParams; 
    } 
}  
public class IndexParams { 

    public IndexParams() { 
    } 
    public IndexParams(String key, float value, String name) { 
     this.key = key; 
     this.value = value; 
     this.name = name; 
    } 
    public String key; 
    public float value; 
    public String name; 
} 

Respuesta

22

Gson tiene algunas limitaciones en cuanto a colecciones a causa de tipo borrado de Java. Puede leer más al respecto here.

De tu pregunta veo que estás usando ArrayList y LinkedList. ¿Estás seguro de que no pretendías usar solo List, la interfaz?

Este código funciona:

List<String> listOfStrings = new ArrayList<String>(); 

listOfStrings.add("one"); 
listOfStrings.add("two"); 

Gson gson = new Gson(); 
String json = gson.toJson(listOfStrings); 

System.out.println(json); 

Type type = new TypeToken<Collection<String>>(){}.getType(); 

List<String> fromJson = gson.fromJson(json, type); 

System.out.println(fromJson); 

actualización: Me cambiado su clase a este, por lo que no tiene que perder el tiempo con otras clases:

class IndicesAndWeightsParams { 

    public List<Integer> indicesParams; 
    public List<String> weightsParams; 

    public IndicesAndWeightsParams() { 
     indicesParams = new ArrayList<Integer>(); 
     weightsParams = new ArrayList<String>(); 
    } 
    public IndicesAndWeightsParams(ArrayList<Integer> indicesParams, ArrayList<String> weightsParams) { 
     this.indicesParams = indicesParams; 
     this.weightsParams = weightsParams; 
    } 
} 

Y el uso de este código , todo funciona para mí:

ArrayList<Integer> indices = new ArrayList<Integer>(); 
ArrayList<String> weights = new ArrayList<String>(); 

indices.add(2); 
indices.add(5); 

weights.add("fifty"); 
weights.add("twenty"); 

IndicesAndWeightsParams iaw = new IndicesAndWeightsParams(indices, weights); 

Gson gson = new Gson(); 
String string = gson.toJson(iaw); 

System.out.println(string); 

IndicesAndWeightsParams fromJson = gson.fromJson(string, IndicesAndWeightsParams.class); 

System.out.println(fromJson.indicesParams); 
System.out.println(fromJson.weightsParams); 
+0

Hola, gracias por la ayuda. Mi objeto no es genérico, sino que contiene dos listas de arreglos. ¿cómo debería usar el tipo?
Tipo Tipo = new TypeToken () {} getTrype no funciona :-( – Jeb

+0

por cierto:.. Dos ArrayList con dos objetos differnet acabo de cambiar a una lista y la lista Jeb

+0

@ user450602: editar el post y añadir código de su objeto y sus listas de arreglos. No quiero adivinar nada. – darioo