我正在使用 Jersey API 实现简单的 RESTful Web 服务。我的服务器项目托管在 Apache Tomcat 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 类的对象。
我错过了什么吗?或者这是一个错误?
最佳答案
Jersey 支持很少的 JSON 表示法,并且每种表示法对于生成的 JSON 的外观都有稍微不同的约定。您可以在 JavaDoc 中看到符号之间的差异。 。默认值是 MAPPED
,正如您已经发现的那样,它将在 JSON 输出中的数字周围加上引号。
您可以做两件事:
- 打开Jackson POJO support它使用 Jackson 库来创建 JSON 输出(如果您也在客户端使用 Jackson,也许这将是一个更好的选择)。还有一个如何使用它的示例 - JacksonJsonProvider .
- 使用
NATURAL
JSON 表示法来按照您的预期处理数字。为此,您需要提供自定义 ContextResolver并将其注册到您的应用程序中。如何实现这一点的示例可以在 Jersey User Guide 中找到。 ( JSON Support - Configuration Options ) 或在样本 json-from-jaxb 之一中(参见JAXBContextResolver)。
关于java - Jersey 将字符值序列化为 ASCII 等效数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048658/