如何正确解组JAX-RS Web服务响应(JSON数组)?

时间:2011-10-19 14:41:29

标签: json web-services jersey jax-rs gson

我使用Jersey REST网络服务时遇到了一些问题。

我有以下域类:

@XmlRootElement
public class User {

    private long id;
    private String email;
    private String forename;
    private String role;

    public User() {
        // required for JAXB
    }

    // + Getters + Setters
}

和以下资源类:

@Produces(MediaType.APPLICATION_JSON)
@Path("/users")
public class UserService {

    @GET
    public User[] getUsers() {
        User[] users = ... // Users from DB 
        return users;
    }
}

如果我请求该资源(/ users),我会收到以下json响应:

{
 "user":  
 [
  {
   "id":"1",
   "email":"Toby@email.com",
   "forename":"Toby",
   "role":"admin"
  }
 ,
  {
   "id":"2",
   "email":"Rob@email.com",
   "forename":"Rob",
   "role":"developer"
  }
 ]
}

在客户端(我有相同的User.class)我想将此JSON响应解组回相应的POJO。这意味着在这个例子中我想得到两个User类型的Object。我用GSON做了一些实验性的东西,比如

User[] users = gson.fromJson(JSONString, User[].class)

但是无法让它发挥作用。例外:

JSONParseException: Expecting object but found array

谁能告诉我这里做错了什么?或者我的json格式是问题吗?

修改 尝试使用自己的集合类型适配器实现here

Type usersType = new TypeToken<List<User>>() {}.getType();
List<User> users = new ArrayList<User>();
users = gson.fromJson(reader, usersType);

现在我得到一个JsonParseException:

The JsonDeserializer failed to deserialize Json Object {"user":[{"id":"1","email":"Toby@email.com","forename":"Toby",....

1 个答案:

答案 0 :(得分:0)

它真的是json响应的格式!在post的帮助下,我绕过了Object-&gt; XML-&gt; JSON方式直接进行了对象 - > JSON转换,这导致了gson可以解释的干净的JSON语法。我会很快用我的完整示例来源更新答案。