Java JAX-RS服务响应返回不带小数点的双字段

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

我正在开发一个JAX-RSWeb服务,它将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规范的一部分,但我找不到确切的位置。如果您愿意,您可以在客户端使用
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,因此没有新的附加依赖项。