私はREST APIを構築しており、JSON
とXML
を返す必要があります。私はJerseyを使ってREST APIを構築しています。ここでJSONとXMLが一致しません
は私のモデルクラスです:
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.hoxha.test.test.Certificate;
import org.hoxha.test.test.Grade;
import org.hoxha.test.test.Student;
@Path("certs")
public class CertificateResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getCertJson() {
Certificate cert = getCertificate();
return Response.ok(cert, MediaType.APPLICATION_JSON).build();
}
private Certificate getCertificate() {
Certificate cert = new Certificate();
Student student = new Student(1, "John", "Doe");
cert.setStudent(student);
List<Grade> grades = new ArrayList<>();
grades.add(new Grade("Algorithms", "A"));
grades.add(new Grade("OOP", "B"));
grades.add(new Grade("English", "C"));
cert.setGrades(grades);
return cert;
}
@GET
@Produces(MediaType.APPLICATION_XML)
public Response getCertXml() {
Certificate cert = getCertificate();
return Response.ok(cert, MediaType.APPLICATION_XML).build();
}
}
:
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Certificate {
private Student student;
private List<Grade> grades;
public Certificate() {
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Grade> getGrades() {
return grades;
}
public void setGrades(List<Grade> grades) {
this.grades = grades;
}
}
- -
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Student {
private int id;
private String name;
private String surname;
public Student(){
}
public Student(int id, String name, String surname) {
this.id = id;
this.name = name;
this.surname = surname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Grade {
private String subject;
private String mark;
public Grade(){
}
public Grade(String subject, String mark) {
this.subject = subject;
this.mark = mark;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
}
そしてここでは、RESTエンドポイントです
私はJSON
を返すと問題なく動作します。 Grades
が適切なJSON array
として返されます。ここでの結果です:
{
"grades": [
{
"mark": "A",
"subject": "Algorithms"
},
{
"mark": "B",
"subject": "OOP"
},
{
"mark": "C",
"subject": "English"
}
],
"student": {
"id": 1,
"name": "John",
"surname": "Doe"
}
}
にはどうすればXML形式でこの結果を得ることができます。
<certificate>
<grades>
<grade>
<mark>A</mark>
<subject>Algorithms</subject>
</grade>
<grade>
<mark>B</mark>
<subject>OOP</subject>
</grade>
<grade>
<mark>C</mark>
<subject>English</subject>
</grade>
</grades>
<student>
<id>1</id>
<name>John</name>
<surname>Doe</surname>
</student>
</certificate>
私は取得しています結果は次のとおりです。
<certificate>
<grades>
<mark>A</mark>
<subject>Algorithms</subject>
</grades>
<grades>
<mark>B</mark>
<subject>OOP</subject>
</grades>
<grades>
<mark>C</mark>
<subject>English</subject>
</grades>
<student>
<id>1</id>
<name>John</name>
<surname>Doe</surname>
</student>
</certificate>
私はXML
を固定した場合、のは言わせて私はのGrade
オブジェクトを含むGrades
オブジェクトを追加して、余分な(不要な)JSON
オブジェクトを取得します。
解決方法はありますか?あなたの証明書のクラス
@XmlRootElement
public class Certificate {
private Student student;
@XmlElementWrapper(name = "grades")
private List<Grade> grade;
[This(http://stackoverflow.com/questions/24307106/how-to-annotate-a-list-using-xmlelement)が役立つかもしれません。うまくいけば、JSONの生成に悪影響を及ぼさないことを望みます。 –
Andrew S、ありがとうございましたが、あなたのコメントはちょっと遅かったです。それは私がそれを解決したのとまったく同じです。 –