泽西岛休息服务器 - 返回列表为json

sja*_*der 7 java rest json jersey

在Tomcat和Glassfish上运行时,我遇到运行相同代码的返回列表的json结构的差异.

@XmlRootElement
public Class Person {
    private int personId;
    private String name;
}

@GET
@Path("/persons")
public Response getPersons()
{
    List<Person> persons = new ArrayList<Person>();
    persons.add(new Person(1, "John Smith"));
    persons.add(new Person(2, "Jane Smith"));

    GenericEntity<List<Person>> entity = new GenericEntity<List<Person>>(Lists.newArrayList<persons)) {};
    Return Response.ok(entity).build();
}
Run Code Online (Sandbox Code Playgroud)

如果在tomcat上以json格式返回(我在本地机器上运行Tomcat),结果将是:

[
    {
        "personId" : "1",
        "name" : "John Smith"
    },
    {
        "personId" : "2",
        "name" : "Jane Smith"
    }
]
Run Code Online (Sandbox Code Playgroud)

如果在Glassfish上以json格式返回(在远程服务器上运行Glassfish),结果将是:

{
    "person" : 
    [
        {
            "personId" : "1",
            "name" : "John Smith"
        },
        {
            "personId" : "2",
            "name" : "Jane Smith"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能控制这种格式?如果可能的话,我更喜欢数组格式(如在Tomcat上).无论哪种方式,我希望它产生相同的结果.

编辑:

依赖关系:jersey-container-servlet(2.14),jersey-server(2.14),jersey-media-moxy(2.14),javax.servlet-api(3.0.1)

Glassfish版本:3.1.2.2(版本5)

编辑2:这是泽西岛2.14和Glassfish 3.x的问题

我刚刚安装了Glassfish 3和4,并部署了其余应用来检查响应.返回列表时会产生不同的json结构.Glassfish 4的响应与我在Tomcat上运行时得到的结果相同.

FrA*_*rAn 1

尝试添加响应媒体类型注释并尝试使用 List 而不是 GenericEntity,如下所示:

 @GET
 @Path("/persons")
 @Produces({ MediaType.APPLICATION_JSON })
 public Response getPersons()
 {
    List<Person> persons = new ArrayList<Person>();
    persons.add(new Person(1, "John Smith"));
    persons.add(new Person(2, "Jane Smith"));

 Return Response.ok(persons).build();
 }
Run Code Online (Sandbox Code Playgroud)

  • 然后尝试返回一个 List&lt;Person&gt; 对象。`public List&lt;Person&gt; getPersons() {` 并仅返回 `return Persons;` 如果您还没有 JAXB 的 Person 类,您可能还需要一个无参构造函数。 (2认同)