You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XStream反序列化JSON对象时遇类解析异常求助

解决XStream JSON反序列化的CannotResolveClassException异常

问题根源

  1. 序列化/反序列化驱动不匹配:序列化使用JsonHierarchicalStreamDriver,但反序列化用了JettisonMappedXmlDriver,两者生成/解析的JSON结构逻辑不一致,导致XStream无法识别集合中的Student对象。
  2. 缺少无参构造方法:Student类仅定义了带参构造,XStream反序列化时需要通过无参构造实例化对象。
  3. 未配置类别名与集合映射:未给Student类设置别名,也未告知XStreamAcademicGroup中students字段对应的是Student类型的集合,导致解析时把name当成了一个独立类处理,抛出CannotResolveClassException。

修复步骤及代码示例

1. 给Student类添加无参构造

XStream反序列化依赖无参构造创建对象,必须补充:

public class Student {
    private String name;
    private String group;

    // 新增无参构造,供XStream反序列化使用
    public Student() {}

    public Student(String name, String group) {
        this.name = name;
        this.group = group;
    }

    public String getName() {
        return name;
    }

    public String getGroup() {
        return group;
    }

    @Override
    public String toString() {
        return name + " " + group;
    }
}

2. 统一序列化与反序列化的驱动,配置别名和集合映射

修改反序列化方法,使用和序列化一致的JsonHierarchicalStreamDriver,并添加必要的别名和集合映射配置:

public static void studentJsonDeserialization() {
        // 与序列化使用相同的JSON驱动
        XStream xStream = new XStream(new JsonHierarchicalStreamDriver());
        xStream.addPermission(AnyTypePermission.ANY);
        
        // 给实体类设置别名
        xStream.alias("academicGroup", AcademicGroup.class);
        xStream.alias("student", Student.class);
        
        // 配置AcademicGroup的students字段为Student类型的隐式集合
        xStream.addImplicitCollection(AcademicGroup.class, "students", Student.class);

        try {
            AcademicGroup newAcademicGroup = (AcademicGroup) xStream.fromXML(new File("AcademicGroup.json"));
            for (Student student : newAcademicGroup.getStudents()) {
                System.out.println(student.toString());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

3. 优化序列化方法(可选)

为了让生成的JSON结构更规范,也可以在序列化时添加相同的别名和集合映射配置:

public static void studentJsonSerialization() {
        XStream xStream = new XStream(new JsonHierarchicalStreamDriver());
        List<Student> students = Arrays.asList(
                new Student("Student1", "KN-221A"),
                new Student("Student2", "KN-221A"),
                new Student("Student3", "KN-221A")
        );
        AcademicGroup academicGroup = new AcademicGroup();
        for (Student student : students) {
            academicGroup.addStudent(student);
        }
        
        // 统一配置别名和集合映射
        xStream.alias("academicGroup", AcademicGroup.class);
        xStream.alias("student", Student.class);
        xStream.addImplicitCollection(AcademicGroup.class, "students", Student.class);
        
        String json = xStream.toXML(academicGroup);
        try (FileWriter fw = new FileWriter("AcademicGroup.json");
             PrintWriter out = new PrintWriter(fw)) {
            out.println(json);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
}

验证结果

运行修改后的反序列化方法,控制台将正确输出:

Student1 KN-221A
Student2 KN-221A
Student3 KN-221A

内容的提问来源于stack exchange,提问作者Карина Карпенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:53