如何使用JAXB,JAX-RS 2.0和MOXy将Java类编组为JSON

时间:2014-07-04 13:28:30

标签: json rest jaxb marshalling moxy

我有一个在Tomcat 7上运行的Web应用程序,它使用Jersey 1.8提供一个REST服务,根据下面显示的类文件生成一个JSON文件。

@XmlRootElement
public class Person {

    public String firstname;
    public String lastname;
    public String email;

    public Person() {
    }

    public Person(String firstname, String lastname, String email) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
   }
}

我使用下面显示的服务生成JSON文件。

@GET
@Path("allpersons")
@Produces(MediaType.APPLICATION_JSON)
public Collection<Person> getAllPersons() {
    Person p1 = new Person("Albert","Marks","albert.marks@email.com");
    Person p2 = new Person("David","Spencer","david.spencer@email.com");
    Collection<Person> all = new ArrayList<>();
    all.add(p1);
    all.add(p2);
    return all;
}

这将导致具有以下形式的JSON文件:

{ "person": [  
    { "firstname":"Albert",
      "lastname":"Marks",
      "email":"albert.marks@email.com"},
    {  "firstname":"David",
       "lastname":"Spencer",
       "david.spencer@email.com"} 
  ]
}

这一切都很好,但后来我不得不更新到Jersey 2.10。既然他们我也使用jersey-media-moxy 2.10。但是,现在生成的JSON如下所示,它打破了调用服务的JavaScript库:

[  
    { "firstname":"Albert",
      "lastname":"Marks",
      "email":"albert.marks@email.com"},
    {  "firstname":"David",
       "lastname":"Spencer",
       "david.spencer@email.com"} 
]

我比较了使用两个版本的Jersey生成的XML文件,它们完全相同。因此我想它一定是MOXy的一些配置问题。我尝试提供一个继承javax.ws.rs.core.Application的自己的类,但效果仍然相同。知道原因是什么吗?

1 个答案:

答案 0 :(得分:0)

MOXy的JSON绑定将Java java.util.Collection呈现为JSON数组(make的意义正确吗?)。如果您希望它包含根级person键,那么您可以返回具有Collection<Person>属性Collection或带注释的类的实例,而不是返回person@XmlElement(name="person")