带指数的数值的 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中文网其他相关文章!