我在使用GSON解析通用ArrayList
时遇到了一些麻烦。我已经确认,如果指定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 :(得分: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