2017-02-09 35 views
1

我正在構建一個REST API,需要返回JSONXML。我正在使用Jersey來構建REST API。JSON和XML不匹配

這裏是我的模型類:

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終點:

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

} 

當我返回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,讓我們說我添加一個Grades對象,其中包含一個ListGrade對象,然後我得到一個額外的(不必要的)JSON對象。

有沒有解決方法呢?

+1

[This](http://stackoverflow.com/questions/24307106/how-to-annotate-a-list-using-xmlelement)可能會有所幫助。希望它不會對JSON的生成產生負面影響。 –

+0

Andrew S,謝謝,但我看到你的評論有點晚了。這正如我解決它。 –

回答

2

@NullPointerException,非常感謝!你給了我一個很好的提示。

我通過在getGrades()方法中加入@XmlElementWrapper(name="grades")@XmlElement(name="grade")來解決這個問題。

@XmlElementWrapper(name = "grades") 
@XmlElement(name = "grade") 
public List<Grade> getGrades() { 
    return grades; 
} 
0

使用@XmlElementWrapper(name = "grades")到證書類

@XmlRootElement 
public class Certificate { 
private Student student; 
@XmlElementWrapper(name = "grades") 
private List<Grade> grade; 
+0

不工作。這是我現在得到的:三個陣列,第一個具有所有等級,而另一個只有一個(A,B,C)。無法在此發佈結果。 –

+0

對不起,我得到四個陣列。第一個的所有等級爲 ...元素,另外三個元素有一個元素(每個元素爲A,B,C)。 –