2010-12-06 16 views
13

Ich verwende GSON 1.4 und serialisieren ein Objekt mit zwei generischen arraylist<myObject> wie folgt String data = Gson.toJson(object, object.class). Als ich es desirialize ich gson.fromJson(json, type);deserializing generics mit gson

leider bekomme ich

java.lang.IllegalArgumentException: Kann nicht java.util.ArrayList Feld gesetzt ... zu java.util.LinkedList

Warum ist das? GSON doc merkt an, dass wenn ich mit object.class Parameter serialisiert, es Generics unterstützt. irgendeine Idee? Vielen Dank.

meine Klasse ist:

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

Antwort

22

Gson einige Einschränkungen in Bezug auf Sammlungen haben wegen Java Typ Löschung. Sie können mehr darüber lesen here.

Von Ihrer Frage sehe ich, dass Sie sowohl ArrayList als auch LinkedList verwenden. Sind Sie sicher, dass Sie nicht nur die Schnittstelle List verwenden wollten?

Dieser Code funktioniert:

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

aktualisieren: Ich habe Ihre Klasse diese geändert, so habe ich nicht mit anderen Klassen zu mess around:

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

Und mit diesem Code funktioniert alles für mich:

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

Hallo, Danke für die Hilfe. Mein Objekt ist kein Generikum, sondern enthält zwei Arraylisten. Wie soll ich den Typ verwenden?
Typ type = neue TypeToken () {} getTrype funktioniert nicht :-( – Jeb

+0

btw:.. Zwei Arraylist mit zwei differnet Objekte habe ich es nur und Zur Liste Jeb

+0

@ user450602: Ihr Beitrag bearbeiten, und fügen Sie Code Ihrer Objekt und Ihre Arraylists Ich möchte nichts erraten – darioo