使用XStream反序列化JSON对象时遇类解析异常求助
解决XStream JSON反序列化的CannotResolveClassException异常
问题根源
- 序列化/反序列化驱动不匹配:序列化使用
JsonHierarchicalStreamDriver,但反序列化用了JettisonMappedXmlDriver,两者生成/解析的JSON结构逻辑不一致,导致XStream无法识别集合中的Student对象。 - 缺少无参构造方法:
Student类仅定义了带参构造,XStream反序列化时需要通过无参构造实例化对象。 - 未配置类别名与集合映射:未给
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,提问作者Карина Карпенко
相关产品推荐
相关产品推荐

