2016-04-02 6 views
1

REST APIを作成するにはジャージーではなくジャックソンのみを使用しています。私は2つのモデルオブジェクト、JSONでのカスタムオブジェクトの表示

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; 
    } 

これは私が得た結果です。

[{},{},{}] 

私は間違っています。

+0

が実際にそれを固定

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(); } } 

テストケース。クラスにゲッターとセッターがない場合、これはオブジェクトの印刷方法です。私はgettersとセッターを追加し、それは正常に働いた。ありがとう。 – Zeus

答えて

0

私が正しく理解していれば、idだけで新しいビューモデル表現を作成し、リスト内の各オブジェクトをマップするか、関連するフィールドに@jsonignoreを使用することができます(ジャージーがジャクソンを使用している場合)。あるいは、dbからIDだけを取得することもできます。ユースケースに依存します。

+0

編集内容を確認してください。 – Zeus

1

あなたはジャクソンと、次のようなカスタム・シリアライザを作成することを達成することができます:出力

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" 
}] 
+0

私はリストにCourseSerializerオブジェクトを設定しますか? – Zeus

+0

いいえ、あなたは現在のリストに関して何も変更しません。マッパーにシリアライザを登録するだけで、前と同じようにコースのリストをシリアライズできます。これはジャクソンbtwを使用しています。 – dambros

+0

私はジャクソンを使用していません。 – Zeus

関連する問題