【问题标题】:JSON and XML not matchingJSON 和 XML 不匹配
【发布时间】:2017-06-27 19:32:18
【问题描述】:

我正在构建一个 REST API,需要返回 JSONXML。我正在使用 Jersey 来构建 REST API。

这是我的模型类:

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,假设我添加了一个包含ListGrade 对象的Grades 对象,那么我会得到一个额外的(不必要的)JSON 对象。

这个有解决办法吗?

【问题讨论】:

  • This 可能会有所帮助。希望它不会对 JSON 的生成产生负面影响。
  • Andrew S,谢谢,但我看到你的评论有点晚了。就像我解决的那样。

标签: java json xml rest jax-rs


【解决方案1】:

@NullPointerException,非常感谢!你给了我一个很好的暗示。

我通过将@XmlElementWrapper(name="grades")@XmlElement(name="grade") 添加到getGrades() 方法来解决它。

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

【讨论】:

    【解决方案2】:

    在您的证书类中使用@XmlElementWrapper(name = "grades")

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

    【讨论】:

    • 不工作。这就是我现在得到的:三个 数组,第一个包含所有成绩,另一个只有一个(A、B、C)。无法在此处发布结果。
    • 抱歉,我得到了四个数组 。第一个具有所有等级作为 ... 元素,其他三个具有一个 元素(每个等级一个:A、B、C)。
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多