【问题标题】:google cloud endpoints returning java long as string in JSON谷歌云端点以 JSON 格式返回 java long 作为字符串
【发布时间】:2016-04-19 09:25:58
【问题描述】:

我正在使用 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"
}

为什么云端点将 Long 值转换为 JSON 中的字符串。当我使用旧的应用程序引擎版本 1.9.19 时,它曾经可以工作。长时间在 JSON 上渲染也是如此。我在这里有什么遗漏吗?

【问题讨论】:

  • 您是否尝试将您的地图用作Map&lt;String, Long&gt;

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


【解决方案1】:

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,因为它不适用于所有值。所以使用字符串表示。

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

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

规格:

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多