JSON中的自定义对象显示

时间:2016-04-02 12:53:13

标签: java jersey

我只使用jersey而不是jackson来创建REST api。我有两个模型对象,

public class Course {
    private int id;
    private String name;
    private Teacher teacher;
}

public class Teacher {

    private int id;
    private String givenName;
    private String familyName;

}

我正在创建服务并返回课程对象列表

public List<Course> getAll(){
        return db.getCourseList();
    }

显示如预期,

[{"id":101,"name":"Introduction to Java","teacher":{"familyName":"Bar","givenName":"Foo","id":201}},{"id":102,"name":"Intermediate Java","teacher":{"familyName":"Prank","givenName":"Foo","id":202}}]

现在我想自定义我的JSON对象,以下列格式显示,只显示教师ID。

[{"id":"100","name":"Introduction to Java","teacherId":"201"},{"id":"101","name":"Intermediate Java","teacherId":"201"}

所以这是我设计的视图模型。

@XmlRootElement
public class CourseTeacherIdView {

    private int id;
    private String name;
    private int teacherId;

    CourseTeacherIdView(){

    }

    public CourseTeacherIdView(int id, String name, int teacherId){
        this.id = id;
        this.name = name;
        this.teacherId = teacherId;
    }

}

我使用此方法返回视图对象列表。

public List<CourseTeacherIdView> getAll(){
        List<Course> list = db.getCourseList();
        List<CourseTeacherIdView> viewList = new ArrayList<>();
        for(Iterator<Course> itr = list.iterator(); itr.hasNext();){
            Course c = (Course) itr.next();
            viewList.add(new CourseTeacherIdView(c.getId(), c.getName(), c.getTeacher().getId()));
        }
        return viewList;
    }

这是我得到的结果。

[{},{},{}]

我做错了什么。

2 个答案:

答案 0 :(得分:1)

您可以使用Jackson实现这一目标,并创建如下所示的自定义序列化程序:

public class CourseSerializer extends JsonSerializer<Course> {
    @Override
    public void serialize(Course value,
                          JsonGenerator gen,
                          SerializerProvider serializers) throws IOException {

        gen.writeStartObject();

        Field[] fields = value.getClass().getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true);
            try {
                Object obj = field.get(value);
                if (obj instanceof Teacher) {
                    Teacher teacher = (Teacher) obj;
                    gen.writeStringField("teacherId", String.valueOf(teacher.getId()));
                } else {
                    gen.writeStringField(field.getName(), obj.toString());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        gen.writeEndObject();
    }
}

测试用例:

public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(Course.class, new CourseSerializer());
    mapper.registerModule(module);

    Teacher teacher1 = new Teacher(123, "teacher1", "surename1");
    Teacher teacher2 = new Teacher(234, "teacher2", "surename2");
    Course course1 = new Course(1, "course1", teacher1);
    Course course2 = new Course(2, "course2", teacher2);
    List<Course> courses = Arrays.asList(new Course[]{course1, course2});

    String serialized = mapper.writeValueAsString(courses);
}

输出:

[{
    "id": "1",
    "name": "course1",
    "teacherId": "123"
}, {
    "id": "2",
    "name": "course2",
    "teacherId": "234"
}]

答案 1 :(得分:0)

如果我理解正确你可以创建只有id的新视图模型表示并将列表中的每个对象映射到它,或者在不相关的字段上使用@jsonignore(如果jersey使用Jackson)。或者甚至只从db中检索id。取决于用例。