首页 >后端开发 >Golang >JSON 数字在解组到接口后被截断

JSON 数字在解组到接口后被截断

PHPz
PHPz转载
2024-02-10 09:48:08612浏览

JSON 数字在解组到接口后被截断

在开发过程中,我们经常会使用JSON格式来传输数据。然而,有时候我们会发现在解组JSON数据到接口后,数字数据会被截断。这是一个很常见的问题,但却很容易被忽视。在本文中,php小编子墨将详细介绍这个问题的原因,以及如何避免和解决这个问题,确保数字数据的完整性和准确性。

问题内容

所以我有一个包含许多字段的 json,并且我按照建议循环遍历它 如何有效地更改 json 键 删除一些我不需要的键。但是删除后,现有json的原始值发生了变化,其中一些似乎是浮点数,我做了一个演示来展示它。

如何改变这种行为?是 interface{} 导致了该问题吗?为什么1684366653200744506被截断为1684366653200744400

谢谢!

https://go.dev/play/p/x2auwqwb2fl

作为参考,输出 json 更改为 1684366653200744400

2009/11/10 23:00:00 1684366653200744448.000000
2009/11/10 23:00:00 map[timestamp:1.6843666532007444e+18]
2009/11/10 23:00:00 json Marshal from maps of key string and value interface to batch json for insert to DB
2009/11/10 23:00:00 {"timestamp":1684366653200744400}

解决方法

这是因为默认情况下,encoding/json 包将 float64 存储在 json 数字的接口值中。请参阅 json.unmarshal

要将 json 解组为接口值,unmarshal 将以下内容之一存储在接口值中:

  • bool,用于 json 布尔值
  • float64,用于 json 数字
  • ...

您可以创建解码器并调用 (*decoder).usenumber改变行为:

jsonBatch := `{"timestamp":1684366653200744506, "todelete":"string value or boolean value"}`
dec := json.NewDecoder(strings.NewReader(jsonBatch))
dec.UseNumber()
var i interface{}
if err := dec.Decode(&i); err != nil {

参见https://www.php.cn/link/3a6c2c9231df58107434b942fa600b22.

以上是JSON 数字在解组到接口后被截断的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除