我正在使用Jersey API实现简单的RESTful Web服务。我的服务器项目托管在Apache Tomcat ver 6.0上,它包含 asm-3.0.jar , jersey-bundle-1.9.1.jar 和 jsr311-api- 1.1.1.jar 即可。
我有两个资源类。一个是UserItemsResource
,用于表示UserItem
个对象的集合。另一个是UserItemResource
,代表单个UserItem
资源。
以下是UserItemsResource
类的代码:
@Path("/useritems")
public class UserItemsResource {
@Context
UriInfo uriInfo;
@Context
Request request;
@Path("{userId}")
public UserItemResource getUserItemResource(@PathParam("userId") long userId) {
return new UserItemResource(uriInfo, request, userId);
}
}
UserItemResource
类:
public class UserItemResource {
@Context
UriInfo uriInfo;
@Context
Request request;
private long userId;
public UserItemResource(UriInfo uriInfo, Request request, long userId) {
this.uriInfo = uriInfo;
this.request = request;
this.userId = userId;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public UserItem getUserItem() {
return new UserItem(userId, 'M', "Pawan");
}
}
UserItem
类:
@XmlRootElement
public class UserItem {
private long userId;
private char sex;
private String displayName;
public UserItem() {
}
public UserItem(long userId, char sex, String displayName) {
this.userId = userId;
this.sex = sex;
this.displayName = displayName;
}
public long getUserId() {
return userId;
}
public char getSex() {
return sex;
}
public String getDisplayName() {
return displayName;
}
public void setUserId(long userId) {
this.userId = userId;
}
public void setSex(char sex) {
this.sex = sex;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
}
当我调用资源(如/useritems/101
)时,我收到服务器的响应。
HTTP/1.1 200 OK
Date: Wed, 24 Oct 2012 11:30:35 GMT
Transfer-Encoding: chunked
Content-Type: application/json
Server: Apache-Coyote/1.1
{
"displayName": "Pawan",
"sex": "77",
"userId": "101"
}
您可以看到“sex”属性的值生成为“77”,它是字符“M”的ASCII等效值。我相信这应该只是“M”,所以我的客户端代码可以成功地将其解析回“M”。我正在使用 Jackson API(版本2.0.2)将服务器响应中的json实体解析回UserItem类的对象。
我错过了什么吗?或者这是一个错误吗?
答案 0 :(得分:1)
Jersey支持很少的JSON符号,并且每个符号都有一个关于生成的JSON应该如何的略微不同的约定。您可以在此JavaDoc中看到符号之间的区别。默认值为MAPPED
,它会在您已经找到的JSON输出中为数字添加引号。
您可以做两件事:
NATURAL
JSON表示法来处理您期望的数字。为此,您需要提供自定义ContextResolver并在您的应用程序中注册它。有关如何实现此目标的示例,请参阅Jersey User Guide(JSON Support - Configuration Options)或其中一个示例json-from-jaxb(请参阅JAXBContextResolver)。