2016-09-21 7 views
0

Ich habe einige Probleme beim Parsen eines generischen ArrayList mit GSON. Ich habe bestätigt, dass diese Methode funktioniert, wenn der spezifische Typ für die ArrayList angegeben ist (ohne Generics), aber ich möchte eine Methode schreiben, die mit Generics funktioniert.Parsing generische ArrayList mit GSON

Basierend auf anderen Stapelüberlauf Fragen sollte dies funktionieren, und ich kann nicht wirklich verstehen, warum es nicht. Es ist nicht möglich, die ArrayList zu parsen, so dass alles, was ich bekomme, eine Sammlung von LinkedTreeMap ist. Die generische Methode ist unter:

public <T> List<T> listFromJson(@NonNull Class<T> classOfT) throws JsonSyntaxException { 
    if (data == null) 
     return null; 
    Gson gsonParser = new Gson(); 
    TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {}; 
    return gsonParser.fromJson(gsonParser.toJson(data), token.getType()); 
} 

Edit:data ist nur ein Object, die die json enthält analysiert werden. Die Anweisung gsonParser.toJson(data) funktioniert gut.

Und ich rufe es so, wo MyClass könnte jede benutzerdefinierte Java-Klasse sein, die ich geschrieben habe:

List<MyClass> resList = result.listFromJson(MyClass.class); 

Jede Hilfe würde geschätzt, ich weiß nicht wirklich, was das Problem ist aber es ist sicher mit den Vorlagen verwandt, da eine nicht-generische Methode die Arbeit erledigen würde.

Edit2: Nur um zu klären, ich bin auch auch die nicht Generika Methode, die funktioniert:

public List<MyClass> listFromJson() throws JsonSyntaxException { 
     Type listType = new TypeToken<ArrayList<MyClass>>(){}.getType(); 
     Gson gsonParser = new Gson(); 
     return gsonParser.fromJson(gsonParser.toJson(data), listType); 
    } 

Antwort

0

Wenn ich Daten auf eine String[] dann sowohl Ihrer Implementierungen arbeiten für mich gesetzt. Verwenden Sie dieselben Importe? Ich bin mit dieser Gson Version 'com.google.code.gson:gson:2.7'

import static org.junit.Assert.*; 

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

import org.junit.Test; 

import com.google.gson.Gson; 
import com.google.gson.JsonSyntaxException; 
import com.google.gson.reflect.TypeToken; 

public class SomeTest { 

    private String[] data = { "Hello" }; 

    public <T> List<T> listFromJson(Class<T> classOfT) throws JsonSyntaxException { 
    if (data == null) 
     return null; 
    Gson gsonParser = new Gson(); 
    TypeToken<ArrayList<T>> token = new TypeToken<ArrayList<T>>() {}; 
    return gsonParser.fromJson(gsonParser.toJson(data), token.getType()); 
    } 

    public List<String> listFromJson() throws JsonSyntaxException { 
    Type listType = new TypeToken<ArrayList<String>>(){}.getType(); 
    Gson gsonParser = new Gson(); 
    return gsonParser.fromJson(gsonParser.toJson(data), listType); 
} 

    @Test 
    public void parsingGenericArrayListUsingGSON_0() { 
    List<String> actual = listFromJson(String.class); 
    List<String> expected = new ArrayList<>(); 
    expected.add("Hello"); 
    assertEquals(expected, actual); 
    } 

    @Test 
    public void parsingGenericArrayListUsingGSON_1() { 
    List<String> actual = listFromJson(); 
    List<String> expected = new ArrayList<>(); 
    expected.add("Hello"); 
    assertEquals(expected, actual); 
    } 
} 

Sie müssen auch nicht die Class<T> classOfT Parameter übergeben. Definieren Sie die Signatur so

public <T> List<T> listFromJson() throws JsonSyntaxException 
+0

Hallo, Entschuldigung für die lange Zeit ohne zu beantworten, aber ich bin in diesen Tagen sehr beschäftigt. Ich benutze Gson Version 1.19, verwaltet von Maven. Ich muss diese Version weiterhin verwenden. Bitte versuchen Sie eine benutzerdefinierte Klasse mit einigen Attributen zu definieren und testen Sie die Methode damit, es funktioniert nicht für mich. Dieser Beitrag war ursprünglich für Android gedacht, aber die Methode in Java getestet und alles, was ich bekomme, ist eine LinkedHashMap als Ergebnis des Parsing-Prozesses ... kann nicht herausfinden, warum – JorgeGRC