【问题标题】:Providing the class for generic ArrayList within the fromJson in java gson [duplicate]在java gson中的fromJson中为通用ArrayList提供类[重复]
【发布时间】:2014-04-09 13:21:00
【问题描述】:

当我将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 = "-";

}

【问题讨论】:

    标签: java json class generics gson


    【解决方案1】:

    使用下面的代码:

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

    而不是

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

    【讨论】:

      【解决方案2】:

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

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

        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

      【讨论】:

      • 是的,知道了。非常感谢!
      【解决方案3】:

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

      试试这个代码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多