【问题标题】:Jersey serializes character value to ASCII equivalent numeric stringJersey 将字符值序列化为 ASCII 等效数字字符串
【发布时间】:2012-10-24 11:50:13
【问题描述】:

我正在使用 Jersey API 实现简单的 RESTful 网络服务。我的服务器项目托管在 Apache Tomcat 6.0 版上,它包含 asm-3.0.jarjersey-bundle-1.9.1.jarjsr311-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 (ver 2.0.2) 将服务器响应中的 json 实体解析回 UserItem 类的对象。

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

【问题讨论】:

    标签: java json rest jersey jackson


    【解决方案1】:

    Jersey 支持的 JSON 表示法很少,而且每种表示法对生成的 JSON 的外观都有略微不同的约定。您可以在此 JavaDoc 中看到符号之间的区别。默认值是 MAPPED,它在 JSON 输出中为数字加上引号,正如您已经发现的那样。

    你可以做两件事:

    【讨论】:

    • 完美。我遵循了您提到的第一种方法,因为我的客户端项目使用 Jackson 来解析 JSON 字符串。我已将 Jackson 库添加到服务器类路径并修改 web.xml 以将 init-param 'com.sun.jersey.api.json.POJOMappingFeature' 设置为 true。现在这工作得很好。感谢您在回答中分享的指针/参考。
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2021-01-08
    • 2010-09-13
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多