使用GSON解析通用ArrayList

时间:2016-09-21 07:13:34

标签: java generics arraylist gson

我在使用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);
   }

1 个答案:

答案 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