readme

多层JSON对象数据的反序列化处理过程

需求分析

小水滴公司正在开发小水滴校园管理系统。其中一个重要的功能是管理和维护学生的信息和当前状态。为了将学生信息保存在文件系统中,小水滴校园管理系统需要将内存中保存的学生对象首先转化为JSON字符串,然后再存放在文件中。当需要使用学生信息时,再将其从文件中读取出来,转化为学生对象。本项目练习的是从文件中读取学生对象的一个步骤。

学生对象的定义在com.littlewaterdrop.bean包中的Student.java文件中。该类包含三个成员变量,它们分别是(1) name,字符串类型;(2) age,整数类型;和(3) major,字符串类型。

package com.littlewaterdrop.bean;

public class Student {
    private String name = null;
    private Integer age = null;
    private String major = null;

    // 需要定义更多的成员变量,以表示该学生完成的课程信息
    ...
}

但是,现在项目有了新的需求,在学生对象中需要包含学生已完成课程的信息。因此,在项目com.littlewaterdrop.bean包中新增了Course.java类,用于表示课程信息。该类包含了四个成员变量,它们分别是(1) id,长整数类型;(2) name,字符串类型;(3) credits,单精度浮点数类型;和(4) hours,整数类型;分别用于表示课程的编号、名称、学分数和课时数。

package com.littlewaterdrop.bean;

public class Course {
    private Long id = null;  // 课程编号
    private String name = null;  // 课程名称
    private Float credits = null;  // 课程学分数
    private Integer hours = null;  // 课程课时数
    ...
}

单层对象数据反序列化项目中,已实现了StudentInfoLoader::loadStudent()方法。因此,在本项目中,该文件的内容不再需要修改。学员需要在Student.java文件中,为Student对象添加新的成员变量,以便于能将表示学生信息的JSON字符串转换为Student对象。

package com.littlewaterdrop;

public class StudentInfoLoader {
    public Student loadStudent(InputStream stream) {
        if (stream == null) {
            return null;
        }
        
        try {
            ObjectMapper mapper = new ObjectMapper();
            Student theStudent = mapper.readValue(stream, Student.class);
            return theStudent;
        } catch (Exception ex) {
            // Something happened.
            System.err.println(ex.getMessage());
            return null;
        } finally {
            try {
                stream.close();
            } catch (Exception ex) {}
        }
    }
}

以下是一个JSON字符串的用例。注意,一名学生可能已完成多门课程的学习。因此,在下面的例子中,courses是一个数组类型的字段,其中每个元素是一个JSON对象。提示:本项目可在Student类中添加一个List类型的成员变量,表示已完成的课程。这个List对象正好对应下面JSON字符串中的courses字段。字段的名称可使用Jackson库中的标注@JsonProperty指定。Jackson序列化的使用方法可参考这里

{
    name: 'Adam',
    age: 21,
    major: 'Chemistry',
    courses: [
        {
            id: 2683,
            name: 'Introduction to Computer Science',
            credits: 3.0,
            hours: 48
        },
        {
            id: 2686,
            name: 'Data Structures',
            credits: 3.5,
            hours: 56
        }
    ]
}

参考文档

  1. JSON数据格式
  2. Jackson库的工作原理和使用方法
  3. Java语言的特性
  4. Maven工程管理工具
Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.