JSON数据类型陷阱:int64处理与最佳实践 | 开发经验

JSON数据类型陷阱:int64处理与最佳实践 #

引言 #

在跨平台开发中,JSON作为常用的数据交换格式,其类型限制常常会带来意想不到的问题。本文将深入探讨JSON处理int64类型时的常见陷阱,并提供实用的解决方案。

背景 #

客户端和管理端通信,需要上报一些数据,由于数据量比较小,所以使用的 Json 格式,有些字段需要用到 int64。

问题 #

发现自己使用的 Json 库不支持 int64,只支持 int32:

img

那这是怎么回事?int64 不是很常见的类型吗?为什么不支持?又怎么能让它支持?

分析 #

我记得以前用过的 Json 三方库都是支持 int64 的,比如 CJson:

img

而且 Kotlin 和 Swift 中的 Json 也都是支持 int64 的。

那就很奇怪了,为什么有些 Json 库不支持 int64 呢?

我首先搜索的是怎么让 Json 支持 int64,找到了这个帖子:https://stackoverflow.com/questions/209869/what-is-the-accepted-way-to-send-64-bit-values-over-json。

img

通过帖子下面的回复我才发现原来 Json 标准是不支持 int64 这么大的数字的,它最大只支持到 2^53-1,如果超过最大值可能会导致 Json 的解析出错误。注意这里是 Json 的标准不支持 int64,当然有些语言可能解析会正确,但是应该可以肯定的是 JavaScript 不支持解析 int64 的 Json。

也可以看这个中文文档:https://www.fly63.com/article/detial/3770

所以为了遵循 Json 的标准,有些 Json 库把 int64 的支持给拿掉了,而其它那种支持 int64 的 Json 库其实是有潜在的风险的。

那真的有 int64 这种上传的需求怎么办? 使用 string 来替代。

具体可以参考 Google 的文档:https://developers.google.com/discovery/v1/type-format

img

这里你可以看到,Google 所有关于 int64 的类型都是使用的 string 来代替。

所以,我们内部多平台立刻做了统一整改, 协议中所有 Json 的 int64 字段都改成了 string,来预防潜在的 bug。