2010-12-06 31 views
13

J'utilise GSON 1.4 et sérialiser un objet avec deux arraylist<myObject> générique comme suit String data = Gson.toJson(object, object.class). Quand je desirialize ce que je fais gson.fromJson(json, type);désérialiser génériques avec gson

malheureusement je reçois

java.lang.IllegalArgumentException: Impossible de définir le champ java.util.ArrayList ... à java.util.LinkedList

Pourquoi est-ce? GSON doc note que si je sérialise avec le paramètre object.class, il supporte les génériques. une idée? Merci.

ma classe est:

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; 
} 

Répondre

22

Gson a des limites en ce qui concerne les collections en raison de l'effacement de type Java. Vous pouvez en lire plus à ce sujet here.

De votre question, je vois que vous utilisez à la fois ArrayList et LinkedList. Êtes-vous sûr de ne pas vouloir utiliser seulement List, l'interface?

Ce code fonctionne:

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); 

Mise à jour: Je changé votre classe à cela, donc je n'ai pas mess avec d'autres classes:

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; 
    } 
} 

Et en utilisant ce code , tout fonctionne pour moi:

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

Salut, Merci pour l'aide. Mon objet n'est pas un générique mais contient plutôt deux arraylists. comment dois-je utiliser le type?
Type type = new TypeToken () {} getTrype travail ne marche pas :-( – Jeb

+0

BTW:.. Deux arraylist avec deux objets differnet Je viens changé Liste et Liste Jeb

+0

@ user450602: modifier votre code postal et ajouter de votre – darioo