JAX-RS 服务响应返回不带小数位的双字段
JAX-RS service response is returning double fields without decimal places
我正在开发 JAX-RS Web 服务,returns POJO 作为 JSON。 POJO 包含双精度和整数字段。问题是只要双精度字段是整数(例如 - 3.0、22.0 等),返回的 JSON 中的相应字段不包含小数点。对于非整数(3.53、22.2343 等)保留小数位。
我希望服务接口统一,双字段始终有一个小数点。为什么返回的 JSON 没有整数的小数点,我该如何解决?
操作代码如下:
import javax.ws.rs.core.Response;
@GET
@Path("/testjson")
@Produces({ MediaType.APPLICATION_JSON})
public Response testJSON() {
ParentClass parentClass = new ParentClass();
ChildClass childClass = new ChildClass();
parentClass.childClass = childClass;
childClass.pafi = 1.0D;
childClass.claimAmount = 2.0D;
childClass.returnCount = 3.44D;
childClass.accCount = new BigInteger("5");
childClass.snCount = new BigInteger("52");
return Response.ok(parentClass).build();
}
这是 POJO:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParentClass", propOrder = {
"ChildClass"
})
public class ParentClass {
@XmlElement(name = "ChildClass", required = true)
protected ChildClass childClass;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildClass")
public class ChildClass {
@XmlElement(name = "pafi")
protected Double pafi;
@XmlElement(required = true)
protected BigInteger accCount;
@XmlElement(name = "claimAmount")
protected double claimAmount;
@XmlElement(name = "snCount", required = true)
protected BigInteger snCount;
@XmlElement(name = "returnCount")
protected double returnCount;
}
实际 o/p:
{
"ChildClass": {
"accCount": 5,
"pafi": **1**,
"claimAmount": **2**,
"snCount": 52,
"returnCount": 3.44
}}
预计 o/p:
{
"ChildClass": {
"accCount": 5,
"pafi": **1.0**,
"claimAmount": **2.0**,
"snCount": 52,
"returnCount": 3.44
}}
好吧,这不是 JAX-RS 整理您的响应的方式,而是 JavaScript 的工作方式。在控制台中尝试这样的事情:
var a = 2.0;
console.log(a);
您将看到 2
作为输出。应该是 ECMA 规范的一部分,但我找不到确切的位置。如果你愿意,你可以在客户端使用 Number 的 toFixed
方法来保留这个小数点(但它会将 Number 转换为 String)。
我在我的项目中所做的是用 Jackson 显式转换 POJO
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY); // this line is obligatory if you don't have setters/getters
Response.ok(mapper.writeValueAsString(parentClass)).build();
通过这种方式,我在输出中获得了所需的双精度值,如 2.0
。
当然,您必须向项目添加额外的依赖项,例如使用 maven:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
这样您将获得预期的结果,但是如果您的客户端是使用 JavaScript.
等动态类型语言编写的,这只是审美差异
我正在开发 JAX-RS Web 服务,returns POJO 作为 JSON。 POJO 包含双精度和整数字段。问题是只要双精度字段是整数(例如 - 3.0、22.0 等),返回的 JSON 中的相应字段不包含小数点。对于非整数(3.53、22.2343 等)保留小数位。
我希望服务接口统一,双字段始终有一个小数点。为什么返回的 JSON 没有整数的小数点,我该如何解决?
操作代码如下:
import javax.ws.rs.core.Response;
@GET
@Path("/testjson")
@Produces({ MediaType.APPLICATION_JSON})
public Response testJSON() {
ParentClass parentClass = new ParentClass();
ChildClass childClass = new ChildClass();
parentClass.childClass = childClass;
childClass.pafi = 1.0D;
childClass.claimAmount = 2.0D;
childClass.returnCount = 3.44D;
childClass.accCount = new BigInteger("5");
childClass.snCount = new BigInteger("52");
return Response.ok(parentClass).build();
}
这是 POJO:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParentClass", propOrder = {
"ChildClass"
})
public class ParentClass {
@XmlElement(name = "ChildClass", required = true)
protected ChildClass childClass;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildClass")
public class ChildClass {
@XmlElement(name = "pafi")
protected Double pafi;
@XmlElement(required = true)
protected BigInteger accCount;
@XmlElement(name = "claimAmount")
protected double claimAmount;
@XmlElement(name = "snCount", required = true)
protected BigInteger snCount;
@XmlElement(name = "returnCount")
protected double returnCount;
}
实际 o/p:
{
"ChildClass": {
"accCount": 5,
"pafi": **1**,
"claimAmount": **2**,
"snCount": 52,
"returnCount": 3.44
}}
预计 o/p:
{
"ChildClass": {
"accCount": 5,
"pafi": **1.0**,
"claimAmount": **2.0**,
"snCount": 52,
"returnCount": 3.44
}}
好吧,这不是 JAX-RS 整理您的响应的方式,而是 JavaScript 的工作方式。在控制台中尝试这样的事情:
var a = 2.0;
console.log(a);
您将看到 2
作为输出。应该是 ECMA 规范的一部分,但我找不到确切的位置。如果你愿意,你可以在客户端使用 Number 的 toFixed
方法来保留这个小数点(但它会将 Number 转换为 String)。
我在我的项目中所做的是用 Jackson 显式转换 POJO
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY); // this line is obligatory if you don't have setters/getters
Response.ok(mapper.writeValueAsString(parentClass)).build();
通过这种方式,我在输出中获得了所需的双精度值,如 2.0
。
当然,您必须向项目添加额外的依赖项,例如使用 maven:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
这样您将获得预期的结果,但是如果您的客户端是使用 JavaScript.
等动态类型语言编写的,这只是审美差异