2016-09-21 35 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