【发布时间】:2018-12-31 22:21:48
【问题描述】:
How to marshal JSON with bigints? 的问题是关于将 big.Int 值编组为 JSON 中的字符串。这个问题问,一个编组 和解组 big.Int 如何在 JSON 中将原生值 作为数字?
以这种方式传递大值可能与 JSON 的其他实现不兼容,尤其是 JavaScript 和 jq,正如 RFC 7159 所指出的:
请注意,当使用此类软件时,整数和数字 在
[-(2**53)+1, (2**53)-1]范围内可互操作 感觉实现将完全同意他们的数字 价值观。
【问题讨论】:
-
@Flimzy JSON spec 没有为数字指定任何最大值(或最小值)。由于将所有数字都视为双精度浮点值,JavaScript 在处理大于 2^54 的整数时可能会丢失精度,但并非所有语言都如此,特别是 go 并非如此。事实上,使用
int64与 JavaScript 兼容性具有相同的含义,但在 go 中仍然很常用。 -
RFC 7159 警告不要在 JSON 中使用 [-(2^53)+1, (2^53)-1] 范围之外的数字,因此您所尝试的通常不被认为是可移植的,并且通常应该避免。
-
我在问题中添加了关于 RFC 的注释。我仍然认为这是对 JSON 的有效使用,尽管它的前两个字母是通用的序列化格式。使用字符串有其自身的问题,包括双方都同意它们是数字作为字符串,以及 JavaScript 客户端不将它们强制为数字。
-
我还添加了关于
jq处理大整数的相关讨论的链接;通过jq传递这些值之一不能保证是无损转换。
标签: json go biginteger