如何防止 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
文件夹)。
我正在构建一个 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
文件夹)。