google 云端点返回 java 与 JSON 中的字符串一样长

google cloud endpoints returning java long as string in JSON

我正在使用 google App Engine 最新版本 1.9.30,我按如下方式定义我的云端点

@Api(name="app", version="v1", transformers={EndpointDateTransformer.class})
public class MyEndpoints {

    @ApiMethod(name="dummy", path="dummy", httpMethod=HttpMethod.GET)
    public Map<String, Object> dummy(){
        Map<String, Object> dummy = Maps.newHashMap();
        dummy.put("date", DateUtil.getCurrentTimestamp());
        dummy.put("number", 5L);
        return dummy;
    }

}

此处 EndpointDateTransformer 将 Date 转换为 Long 值,端点的 JSON 响应为

{
    "number": "5",
    "date": "1452751174672"
}

但如果我将 5L 更改为 5,那么我会看到 JSON 响应为

{
    "number": 5,
    "date": "1452751174672"
}

为什么云端点在 JSON 中将 Long 值转换为字符串。当我使用旧的应用程序引擎版本 1.9.19 时,它曾经工作过。 Long 在 JSON 上也呈现为 long。我在这里遗漏了什么吗?

JSON 是 JavaScript Object Notation,它实际上是一个有效的 Javascript。所以它应该遵循 javascript 标准。

Javascript的Number是54位数字,从-(2^53 - 1)(2^53 - 1)。但是Java的long是64位数字,从-2^632^63-1

查看差异:

Java Long Max         = 9223372036854775807
Javascript Number Max = 9007199254740992

您根本无法将 Java Long 转换为 Javascript Number,因为它不适用于所有值。所以改用字符串表示。

您有两种可能的解决方案:

或者如果你真的想要 Date,最好将其格式化为 UTC 时区内的 yyyy-MM-dd\'T\'HH:mm:ss。它与 Java脚本日期格式兼容。

规格: