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.

等动态类型语言编写的,这只是审美差异