Java JAX-RS服务响应返回不带小数点的双字段
我正在开发一个JAX-RSWeb服务,它将POJO作为JSON返回。POJO包含双精度和整数字段。问题是,只要双字段是整数(例如-3.0、22.0等),返回的JSON中相应的字段就不包含小数点。非整数保留小数位数(3.53、22.2343等) 我希望服务接口是统一的,这样双字段总是有一个小数点。为什么返回的JSON没有整数的小数点,我该如何解决这个问题 以下是操作代码:Java JAX-RS服务响应返回不带小数点的双字段,java,json,web-services,jax-rs,Java,Json,Web Services,Jax Rs,我正在开发一个JAX-RSWeb服务,它将POJO作为JSON返回。POJO包含双精度和整数字段。问题是,只要双字段是整数(例如-3.0、22.0等),返回的JSON中相应的字段就不包含小数点。非整数保留小数位数(3.53、22.2343等) 我希望服务接口是统一的,这样双字段总是有一个小数点。为什么返回的JSON没有整数的小数点,我该如何解决这个问题 以下是操作代码: import javax.ws.rs.core.Response; @GET @Path("/testjson") @Prod
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规范的一部分,但我找不到确切的位置。如果您愿意,您可以在客户端使用toFixed
数字方法来保留这个小数点(但它会将数字转换为字符串)。好吧,JAX-RS不是这样处理您的响应的,JavaScript就是这样工作的。在控制台中尝试以下操作:
var a = 2.0;
console.log(a);
您将看到
2
作为输出。应该是ECMA规范的一部分,但我找不到确切的位置。如果您愿意,您可以在客户端使用toFixed
数字方法来保留这个小数点(但它会将数字转换为字符串)。我在项目中所做的是使用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>
org.codehaus.jackson
杰克逊地图绘制者
1.9.13
通过这种方式,您将获得期望的结果,但是,如果您的客户机是用动态类型语言(如JavaScript)编写的,那么这只是美学上的差异。我在项目中所做的是显式地使用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>
org.codehaus.jackson
杰克逊地图绘制者
1.9.13
通过这种方式,您将获得所需的结果,但是,如果您的客户端是用动态类型语言(如JavaScript)编写的,那么这只是美学上的差异。为什么这些
**
?你是否在某个时候添加了*
?我想突出显示双字段。为什么要添加这些**
?你是否在某个时候添加了*
?我想突出显示双字段。为什么要添加这些**
?你会在某个时候添加*
吗?我想突出显示双字段。很好的技巧!我没有试过,但很高兴知道这是可以做到的。我们已经使用了Jackson,所以没有新的附加依赖项。这是一个好把戏!我没有试过,但很高兴知道这是可以做到的。我们已经使用了Jackson,所以没有新的附加依赖项。这是一个好把戏!我没有试过,但很高兴知道这是可以做到的。我们已经使用了Jackson,因此没有新的附加依赖项。