2017-02-09 20 views
1

私はREST APIを構築しており、JSONXMLを返す必要があります。私は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; 
+1

[This(http://stackoverflow.com/questions/24307106/how-to-annotate-a-list-using-xmlelement)が役立つかもしれません。うまくいけば、JSONの生成に悪影響を及ぼさないことを望みます。 –

+0

Andrew S、ありがとうございましたが、あなたのコメントはちょっと遅かったです。それは私がそれを解決したのとまったく同じです。 –

答えて

2

@NullPointerExceptionへ

0

使用@XmlElementWrapper(name = "grades")、どうもありがとう!あなたは私に良いヒントをくれました。

@XmlElementWrapper(name="grades")@XmlElement(name="grade")getGrades()メソッドに追加して解決しました。

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

動作しません。これは今私が得ているものです:の3つの配列、最初のものはすべての等級を持ち、他の1つはそれぞれ(A、B、C)にそれぞれ1つしかありません。ここに結果を掲載することはできません。 –

+0

申し訳ありませんが、私は4つの配列を得ています。最初のものはすべて ...要素のようなすべての等級を持ち、他の3つは要素(それぞれA、B、Cに1つ)を持っています。 –

関連する問題