2016-04-02 7 views
1

Ich benutze nur Jersey und nicht Jackson, um eine REST API zu erstellen. Ich habe zwei Modellobjekte,Benutzerdefinierte Objektanzeige in 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; 

} 

ich einen Service und eine Liste der Kurs Objekte Rückkehr

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

Das Display wie erwartet,

[{"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}}] 

Now I möchte mein JSON-Objekt so anpassen, dass es im folgenden Format mit nur der Lehrer-ID angezeigt wird.

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

Das ist also die Ansicht Modell, das ich entworfen.

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

} 

Und ich verwende diese Methode, um die Liste der Ansichtsobjekte zurückzugeben.

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

Das ist das Ergebnis, das ich bekomme.

[{},{},{}] 

Was mache ich falsch.

+0

es tatsächlich fixiert. Anscheinend, wenn die Klasse keine Getters und Setter hat, werden die Objekte so gedruckt. Ich habe die Getter und Setter hinzugefügt und es hat gut funktioniert. Vielen Dank. – Zeus

Antwort

0

Wenn ich Sie richtig verstanden habe, könnten Sie entweder eine neue Ansichtsmodelldarstellung nur mit der ID erstellen und jedes Objekt in der Liste zuordnen oder @jsonignore in nicht relevanten Feldern verwenden (wenn Jersey Jackson verwendet). Oder rufen Sie nur die IDs aus der Datenbank ab. Abhängig vom Anwendungsfall.

+0

Bitte überprüfen Sie die Änderungen. – Zeus

1

Sie können mit Jackson erreichen, dass und einem benutzerdefinierten Serializer wie folgt zu erstellen:

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

Testfall:

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

Ausgang:

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

Also fülle ich meine Liste mit CourseSerializer-Objekten? – Zeus

+0

Nein, Sie ändern nichts an Ihrer aktuellen Liste. Sie müssen nur den Serializer auf dem Mapper registrieren, und Sie können einfach eine Liste von Kursen wie zuvor serialisieren. Dies ist mit Jackson BTW. – dambros

+0

Nun, ich benutze nicht Jackson. – Zeus

Verwandte Themen