简体   繁体   English

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法转换为asd.Grade

[英]java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to asd.Grade

i have a large scale project in my hands but i simulated the problem i'm struggling with in this example: 我手上有一个大型项目,但在此示例中我模拟了遇到的问题:

my first class: 我的第一堂课:

package asd;

import java.io.Serializable;

public class Grade implements Serializable{
String name;
Integer score;

public String getName() {
    return name;
}

public Grade() {}

public Grade(String name, Integer score) {
    this.name = name;
    this.score = score;
}

public void setName(String name) {
    this.name = name;
}

public Integer getScore() {
    return score;
}

public void setScore(Integer score) {
    this.score = score;
}
}

my second class: 我的第二堂课:

package asd;

import java.io.Serializable;


public class Student implements Serializable {
private String name;
private Object grade;

public String getName() {
    return name;
}

public Student(String name, Object grade) {
    this.name = name;
    Grade = grade;
}

public Student() {}

public void setName(String name) {
    this.name = name;
}

public Object getGrade() {
    return Grade;
}

public void setGrade(Object grade) {
    Grade = grade;
}
}

and this is my main class: 这是我的主要课程:

package asd;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.*;

public class Test {
public static void main(String[] args){
    Student s1 = new Student();
    s1.setName("JeanPierre");
    s1.setGrade(new Grade("Math", 8));

    Gson gson = new GsonBuilder().create();
    String convertedToJson = gson.toJson(s1);
    System.out.println("Json string: " + convertedToJson);

    Student s2 = gson.fromJson(convertedToJson, Student.class);

    System.out.println("Student Name: " + s2.getName());
    System.out.println("Grade Name: " + ((Grade)s2.getGrade()).getName());
    System.out.println("Grade Score: " + ((Grade)s2.getGrade()).getScore());

}
}

Output: 输出:

Json string is : Json字符串是:

{"name":"JeanPierre","Grade":{"name":"Math","score":8}}

Student Name: JeanPierre


Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to asd.Grade
    at asd.Test.main(Test.java:24)

My problem is when i call: 我的问题是当我打电话给:

System.out.println("Grade Name: " + ((Grade)s2.getGrade()).getName());

or 要么

System.out.println("Grade Score: " + ((Grade)s2.getGrade()).getScore());

i get this exception: 我得到这个例外:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to asd.Grade
    at asd.Test.main(Test.java:24)

Declaration and setting of the Grade in Student is syntactically wrong. Student声明和设置Grade在语法上是错误的。 Not sure how it's even building like that. 不知道它是如何建立的。

public class Student implements Serializable
{
    protected String name ;
    protected Grade grade ;

    public Student( String name, Grade grade )
    {
       this.setName(name).setGrade(grade) ;
    }

    public String getName()
    { return this.name ; }

    public Student setName( String name )
    {
        this.name = name ;
        return this ;
    }

    public Grade getGrade()
    { return this.grade ; }

    public Student setGrade( Grade grade )
    {
        this.grade = grade ;
        return this ;
    }
}

You need to parse the grade class as well. 您还需要解析年级。 It won't convert the entire complex object in one attempt. 它不会一次尝试转换整个复杂对象。 Try the below code: 试试下面的代码:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Test {
public static void main(String[] args){
    Student s1 = new Student();
    s1.setName("JeanPierre");
    s1.setGrade(new Grade("Math", 8));

    Gson gson = new GsonBuilder().create();
    String convertedToJson = gson.toJson(s1);
    System.out.println("Json string: " + convertedToJson);

    Student s2 = gson.fromJson(convertedToJson, Student.class);

    System.out.println("Student Name: " + s2.getName());

    Grade g = gson.fromJson(s2.getGrade().toString(), Grade.class);
    System.out.println("Grade Name: " + g.getName());
    System.out.println("Grade Score: " + g.getScore());

}
}

Here s2.getGrade().toString() is still a valid JSON string. 此处s2.getGrade().toString()仍然是有效的JSON字符串。 You are converting that to Grade class and using it. 您正在将其转换为Grade类并使用它。 This is the right way to parse complex objects. 这是解析复杂对象的正确方法。 Hope you understood. 希望你能理解。

I changed everything to XML and using XStream now, which works on my tests. 我现在将所有内容都更改为XML,并使用了XStream,可以在我的测试中使用。 Thanks for everyone's answers. 感谢大家的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.google.gson.internal.LinkedTreeMap - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.google.gson.internal.LinkedTreeMap java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为com.example - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法转换为java.util.LinkedHashMap - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.LinkedHashMap java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为模型 - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to model Android:Loop for正在获取java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换 - Android: Loop for is getting java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast 线程“主”中的异常 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 无法转换 - Exception in thread “main” java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast t java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 无法转换为模型类 android - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to model class android java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to pojo.class - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to pojo.class 为什么 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap 无法转换为 com.readbook.chinesepoetry.data.model.Response? - why java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.readbook.chinesepoetry.data.model.Response? 传递参数的通用方法-java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap - generic method passing parramaters - java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM