首页 >后端开发 >Golang >如何在 Go 中处理数值 JSON 解组中的指数?

如何在 Go 中处理数值 JSON 解组中的指数?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-23 07:04:23793浏览

How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn