在java gson中的fromJson中提供泛型ArrayList的类

时间:2014-04-09 13:21:00

标签: java json class generics gson

当我将ArrayList<Student>转换为json对象时,它会按如下方式给出json。

[{"firstName":"Namal","lastName":"Fernando"},{"firstName":"Lakmini","lastName":"Fernando"}]

但是我无法再从我得到的json字符串创建ArrayList<Student>。我该怎么做。问题是在fromJson方法中提供泛型类的类。

我尝试了以下方法,但是发誓。

List<Student> studentsUpdated = gson.fromJson(json, new ArrayList<Student>().getClass());
List<Student> studentsUpdated = gson.fromJson(json, new ArrayList<Student>().getClass().getGenericSuperclass());

Json读/写方法。

private void jsonUtil(){

    List<Student> students = new ArrayList<Student>();

    Student student1 = new Student();
    student1.setFirstName("Namal");
    student1.setLastName("Fernando");
    students.add(student1);

    Student student2 = new Student();
    student2.setFirstName("Lakmini");
    student2.setLastName("Fernando");
    students.add(student2);

    Gson gson = new Gson();
    String json = gson.toJson(students);

    System.out.println("jsonUtil().json : " + json);

    List<Student> studentsUpdated = gson.fromJson(json, ArrayList<Student>.class); // This is the place that the error occured

}

学生班:

class Student{

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    String firstName = "-";
    String lastName = "-";

}

3 个答案:

答案 0 :(得分:1)

使用以下代码:

 Type type = new TypeToken<ArrayList<Student>>(){}.getType();  
 List<Student> studentsUpdated = gson.fromJson(json, type); 

而不是

List<Student> studentsUpdated = gson.fromJson(json, ArrayList<Student>.class);

答案 1 :(得分:1)

您可以使用 TypeToken 将json字符串加载到自定义对象中。

试试这段代码。

List<Student> studentsUpdated = gson.fromJson(json, new TypeToken<List<Student>>(){}.getType()); 

答案 2 :(得分:1)

这是我从谷歌文档中找到的

  

如果您正在序列化/反序列化的对象是   ParameterizedType(即包含至少一个类型参数并且可以   是一个数组)然后你必须使用toJson(对象,类型)或   fromJson(String,Type)方法。这是一个序列化和示例   deserialing参数化类型:

  Type listType = new TypeToken<List<String>>() {}.getType();
  List<String> target = new LinkedList<String>();  target.add("blah");

  Gson gson = new Gson();
 String json = gson.toJson(target, listType);
 List<String> target2 = gson.fromJson(json, listType);

您可以尝试使用TypeToken