【问题标题】:How to prevent Jersey from parsing numeric fields to string when parsing to json?解析为json时如何防止Jersey将数字字段解析为字符串?
【发布时间】:2016-01-06 23:58:51
【问题描述】:

我正在构建一个 Neo4J 插件,使用 jersey-json 来解析我的 POJO 与 json 之间的关系。问题是我的 REST 服务将数字作为字符串返回。

如果 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 对象:

{
    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 中,并将所有依赖的 jars 添加到我的 /plugins 文件夹中。

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

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

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

【问题讨论】:

    标签: java json neo4j jersey


    【解决方案1】:

    尝试将您的 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 文件夹中)。

    【讨论】:

    • 我没有收到任何错误,但它不适用于整数的原始类型或对象类型。不过代码更简洁,谢谢!
    • 如果引用了错误的jar文件。我的答案已更新。对于提到的那个,我得到{"value":5,"primitiveValue":6} 作为回复。
    • 我将 jackson-jaxrs-json-provider 添加到我的 pom 和我的插件文件夹中,但仍然得到相同的结果。在我的插件文件夹中,我现在有以下罐子:jackson-jaxrs-json-provider-2.6.2.jar、jackson-jaxrs-base-2.6.2.jar、jackson-core-2.6.2.jar、jersey- json-1.18.1.jar 和 jersey-multipart-1.18.1.jar 与您的设置有什么不同@Stefan Armbruster?
    • 你用的是什么版本的 Neo4J?
    • 不确定是否有区别,但在 Item 类上没有 @XmlRootElement 注释。如果时间允许,我会尝试组装一个最小的设置并通过 github 分享。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多