如何防止 Jersey 在解析为 json 时将数字字段解析为字符串?

How to prevent Jersey from parsing numeric fields to string when parsing to json?

我正在构建一个 Neo4J 插件,使用 jersey-json 来解析我的 POJO 和 json。问题是我的 REST 服务 return 数字作为字符串。

如果 POJO 看起来像这样:

@XmlRootElement
public class Item {
    private Integer value = 5;
    private int primitiveValue = 6;

    public Item() {}

    public Integer getValue() {
        return value;
    }

    public int getPrimitiveValue() {
        return primitiveValue;
    }
}

我得到一个看起来像这样的 JSON-object:

{
    value: "5",
    primitiveValue: "6"
}

但我希望它是这样的:

{
    value: 5,
    primitiveValue: 6
}

我的资源如下所示:

@GET
@Path("/item")
@Produces(MediaType.APPLICATION_JSON)
public Response getItem() {
    return Response.ok(new Item()).build();
}

我的 pom 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>my.project.id</groupId>
    <artifactId>neo4j-extension</artifactId>
    <version>1.0</version>

    <properties>
        <neo4j.version>2.2.0</neo4j.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>${neo4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>server-api</artifactId>
            <version>${neo4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.neo4j.app</groupId>
            <artifactId>neo4j-server</artifactId>
            <version>${neo4j.version}</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.18.1</version>
        </dependency>

    </dependencies>

</project>

你知道我怎么解决这个问题吗?为什么将数字字段解析为字符串的默认行为?

解决方案

根据 Stefan Armbruster 的建议,我将以下依赖项添加到我的 pom,并将所有相关的 jar 添加到我的 /plugins 文件夹中。

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.6.2</version>
</dependency>

并从我的 POJO 中删除了@XmlRootElement 注释。

与之前不同的是,我在响应中得到了所有空值。使用 @XmlRootElement 注释,空值将从响应中删除,但我认为这不会成为问题。

尝试将您的 JAX-RS 方法更改为:

@GET
@Path("/item")
@Produces(MediaType.APPLICATION_JSON)
public Item getItem() {
    return new Item();
}

如果出现错误,请修改 http://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson http://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider/2.6.2 到您的依赖项(并确保此 jar 也部署到 plugins 文件夹)。