背景
客户端和管理端通信,需要上报一些数据,由于数据量比较小,所以使用的Json格式,有些字段需要用到int64。
问题
发现自己使用的Json库不支持int64,只支持int32:
那这是怎么回事?int64不是很常见的类型吗?为什么不支持?又怎么能让它支持?
分析
我记得以前用过的Json三方库都是支持int64的,比如CJson:
而且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。
通过帖子下面的回复我才发现原来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
这里你可以看到,Google所有关于int64的类型都是使用的string来代替。
所以,我们内部多平台立刻做了统一整改,协议中所有Json的int64字段都改成了string,来预防潜在的bug。
不知道大家以前有没有遇到过这个坑。