Golang Json Unmarshal Numeric with Exponent
将 JSON 字符串解组到包含带指数的数值的结构时,您可能会遇到指数始终被截断为 0。当结构体字段的类型与JSON 中的数据类型。
在提供的示例中,Person 结构体的 Id 字段定义为 uint64,表示无符号 64 位整数。然而,JSON 字符串中的值是科学记数法的十进制数(1.2E 8)。
由于 Go 无法自动将带指数的小数转换为无符号 64 位整数,因此结果被截断为0.
如何解决问题
解决此问题问题,您可以修改Id字段的类型以匹配JSON字符串中的数据类型。在这种情况下,由于数字是十进制,因此您可以使用 float32 或 float64:
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
通过将类型更新为 float32 或 float64,Go 现在可以正确解释带有指数的数值并为其赋值到 Person 结构体的 Id 字段。
或者,如果您希望保留 Id 的原始整数类型,您可以使用自定义 JSON解组器钩子。此钩子可以在将浮点值分配给字段之前将其转换为整数:
type Person struct { Id int64 `json:"id"` Name string `json:"name"` } func (p *Person) UnmarshalJSON(b []byte) error { type Alias Person var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } // Convert the float64 Id to int64 p.Id = int64(a.Id) return nil }
使用自定义解组器,JSON 字符串中带有指数的数值将被正确转换并分配给Person 结构体的 Id 字段。
以上是如何在 Go 中处理数值 JSON 解组中的指数?的详细内容。更多信息请关注PHP中文网其他相关文章!