2016-09-21 143 views
0

我在解析GSON的通用ArrayList時遇到了一些麻煩。我已經確認,如果指定了ArrayList的特定類型(不使用泛型),則此方法有效,但我想編寫一種與泛型兼容的方法。使用GSON解析通用ArrayList

基於其他堆棧溢出的問題,這應該工作,我真的不明白爲什麼它不。它不能解析ArrayList,所以我得到的是LinkedTreeMap的集合。通用方法如下:

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

編輯:data只是一個Object包含要解析的JSON。指令gsonParser.toJson(data)工作得很好。

我打電話像這樣,在MyClass可能是任何定製的java類,我寫:

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

任何幫助,將不勝感激,我真的不知道是什麼問題,但它確實與模板有關,因爲非泛型方法可以完成這項工作。

EDIT2:只是爲了澄清,我也包括非泛型方法,它的工作:

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

回答

0

當我設置數據到String[]您的實現則兩個爲我工作。 您是否使用相同的進口? 我用這GSON版本'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); 
    } 
} 

您也不必通過Class<T> classOfT參數。 定義這樣的簽名

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

你好,抱歉很久沒有回答,但我現在很忙。 我使用gson版本1.19,從maven管理。我需要繼續使用這個版本。 請嘗試使用某些屬性定義一個自定義類,然後用它測試該方法,但這不適用於我。這篇文章原本是針對android的,但是在Java中測試了這個方法,並且我得到的是一個LinkedHashMap 作爲解析過程的結果......不知道爲什麼 – JorgeGRC