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

如何在 Go 中用指数解组 JSON 数值?

Patricia Arquette
Patricia Arquette原创
2024-11-15 13:59:03213浏览

How to Unmarshal JSON Numeric Values with Exponents in Go?

带指数的数值的 JSON 解组

Golang 用户在尝试将 JSON 字符串解组为包含带指数的数值的 Go 结构时可能会遇到困难。默认情况下,Go 会误解这些值,从而导致精度损失。

问题演示

考虑以下 Go 代码:

type Person struct {
    Id   uint64  `json:"id"`
    Name string `json:"name"`
}

func parseJSON(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    // The numeric value with an exponent is lost.
    fmt.Println(person.Id)
}

当我们提供像 { "id": 1.2E 8, "name": "John" } 这样的 JSON 字符串作为输入时,parseJSON 函数会打印 0,表示指数被忽略。

解决方案

要解决此问题,请将Id字段的类型调整为浮点类型,例如float64,如下所示:

type Person struct {
    Id   float64 `json:"id"`
    Name string `json:"name"`
}

此修改允许转到正确解释指数并保留数值。

使用 Hooks 的替代方法

对于更改字段类型不可行的情况,您可以采用涉及“虚拟”字段和自定义挂钩。该钩子会将“虚拟”字段中的值转换为所需的整数类型。

type Person struct {
    Id    float64          `json:"id"`
    _Id   int64             
    Name  string           `json:"name"`
}

func parseJSONWithHook(jsonStr []byte) {
    var person Person
    json.Unmarshal(jsonStr, &person)

    if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) {
        person._Id = int64(person.Id)
    }
}

通过采用任一方法,您都可以在 Go 程序中成功处理带有指数的数值。

以上是如何在 Go 中用指数解组 JSON 数值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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