JSON

2016-04-02 23 views
1

için özel nesne görüntüleme Bir REST api oluşturmak için sadece jersey kullanıyorum ve jackson kullanmıyorum. İki modeli nesneleriJSON

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

public class Teacher { 

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

} 

Ben bir hizmet oluşturma ve Ders nesnelerinin bir listesi iade ediyorum, ekran beklendiği gibi

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

Şimdi ben ettik JSON nesnesini, yalnızca öğretmen kimliğiyle aşağıdaki biçimde görüntülenecek şekilde özelleştirmek istiyorum.

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

Bu, tasarladığım görünüm modelidir.

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

} 

Ve bu yöntemi, Görünüm listesi nesneleri döndürmek için kullanıyorum.

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

Bu, elde ettiğim sonuçtur. Neyi yanlış yapıyorum?

+0

Aslında düzelttim. Görünüşe göre eğer sınıfta hiçbir alıcı ve ayarlayıcı yoksa, nesne nasıl yazdırılır. Getters ve setters ekledim ve iyi çalıştı. Teşekkürler. – Zeus

cevap

0

Sizi doğru anladıysam, yalnızca kimliğiyle yeni görünüm modeli temsili oluşturabilir ve listedeki her bir nesneyi eşleştirebilir veya ilgili alanlarda (forma'yı Jackson kullanıyorsa) @jsonignore komutunu kullanabilirsiniz. Veya sadece db'den sadece ids almak. Kullanım durumuna göre değişir.

+0

Lütfen düzenlemeleri kontrol edin. – Zeus

1

Sen Jackson ile ve aşağıdaki gibi özel bir seri hale oluşturarak elde edebilirsiniz:

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

Test durumda:

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

Çıktı:

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

Bu yüzden Listemi CourseSerializer nesnelerine yerleştiriyorum? – Zeus

+0

Hayır, geçerli listenizle ilgili hiçbir şey değiştirmezsiniz. Sadece serileştiriciyi haritalayıcıya kaydettirmeniz yeterlidir ve daha önce olduğu gibi Derslerin bir listesini basitleştirebilirsiniz. Bu Jackson btw kullanıyor. – dambros

+0

Eh, ben Jackson'ı kullanmıyorum. – Zeus