导出为 JSON 时如何保留整数数据类型?

Posted

技术标签:

【中文标题】导出为 JSON 时如何保留整数数据类型?【英文标题】:How to preserve integer data type when exporting to JSON? 【发布时间】:2015-12-04 10:40:42 【问题描述】:

当我以 JSON 格式导出我的 bigquery 表时,INTEGER 字段将转换为字符串。导出时有什么方法可以保持整数数据类型吗?

这里是重现整数->字符串转换现象的最小步骤:

    运行查询SELECT INTEGER(1) AS myInt 并将结果保存到表中。请注意,输出表架构将类型显示为INTEGER。 以 JSON 格式导出表格。输出将是:"myInt":"1"

JSON 格式,"1"is a string,不是整数。

【问题讨论】:

【参考方案1】:

目前这是不可能的;原因是 javascript 规范、IEEE 浮点精度、JSON 和 BigQuery 整数大小的不幸组合。

在Javascript 中,所有数字都必须可以表示为 IEEE754 双精度浮点值。 Javascript 将 JSON 数字解析为 javascript 数字。 BigQuery 使用 64 位有符号整数值。

问题出现是因为并非所有 64 位整数值都可以表示为 IEEE 754 双精度浮点值。 (原因很容易理解:IEEE 754 双精度浮点数使用 64 位,但可以表示很多不是整数的东西;因此,必须有它无法表示的 64 位整数。

因此,为了使 BigQuery JSON 响应在 Javascript 中工作,整数值用引号括起来,这样就不会丢失精度。

也就是说……在 API 请求中将整数表示为字符串的决定是有道理的,因为 API 的许多调用者将使用 javascript。在导出数据时,不将整数表示为数字的论点似乎没有那么令人信服。 (除了现在改变它会是一个突破性的改变)。

您能否向 BigQuery issue tracker 提交错误以解决此问题? (它可能会在导出配置中涉及另一个标志)。

【讨论】:

已提交问题。非常感谢您的回答和额外的上下文。 (我看到问题已解决,无法解决,BigQuery 团队正在进行内部讨论) 很沮丧,这被拒绝了。我精心设计了我的查询以返回我们系统期望的 JSON,现在我发现它不会因为这个问题而解码......(相关问题是 code.google.com/p/google-bigquery/issues/detail?id=31) 我还是讨厌这个。恨恨恨。问题是 code.google.com/p/google-bigquery/issues/detail?id=317

以上是关于导出为 JSON 时如何保留整数数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

将表单数据序列化为 JSON 时如何保留值类型

如何将 pandas 数据框导出为 json 并保留原始日期时间格式?

如何使用 EMR 上的 HiveQL 将 DynamoDB 上的 Map 数据类型列导出到具有 JSON 数据类型的 S3?

json序列化时定制支持datetime类型,和到中文让他保留中文形式

C#中的decimal怎么保留两位小数

Laravel REST API 类型保留(例如,如何防止整数作为字符串发送)