Jersey将字符值序列化为ASCII等效数字字符串

时间:2012-10-24 11:50:13

标签: java json rest jersey jackson

我正在使用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类的对象。

我错过了什么吗?或者这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

Jersey支持很少的JSON符号,并且每个符号都有一个关于生成的JSON应该如何的略微不同的约定。您可以在此JavaDoc中看到符号之间的区别。默认值为MAPPED,它会在您已经找到的JSON输出中为数字添加引号。

您可以做两件事: