谷歌云端点以JSON中的字符串形式返回java long

时间:2016-01-14 06:31:41

标签: java json google-app-engine google-cloud-endpoints

我正在使用谷歌应用引擎最新版本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时,它曾经工作过。在JSON上也可以长时间渲染。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:3)

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

Javascript的号码是54位号码,从-(2^53 - 1)(2^53 - 1)。但Java的长度为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。它与Javascript日期格式兼容。

规格: