将 JSON 数据解组到 Go 结构时,带指数的数值通常会被误解为零。当结构体中的目标字段声明为整数类型时,就会发生这种情况。
要解决此问题,请按照以下步骤操作:
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
这是一个示例:
package main import ( "encoding/json" "fmt" "os" ) type Person struct { Id float32 `json:"id"` Name string `json:"name"` } func main() { // Create the JSON string. var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`) // Unmarshal the JSON to a proper struct. var f Person json.Unmarshal(b, &f) // Print the person. fmt.Println(f) // Unmarshal the struct to JSON. result, _ := json.Marshal(f) // Print the JSON. os.Stdout.Write(result) }
这将输出:
{1.2e+08 Fernando} {"id":1.2e+08,"Name":"Fernando"}
替代方法:
如果必须为字段使用整数类型,则可以使用 float64 类型的“虚拟”字段来捕获带指数的数值。然后,使用钩子将值转换为实际的整数类型。
这是一个示例:
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` } var f Person var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`) _ = json.Unmarshal(b, &f) if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) { fmt.Println(f.Id) f._Id = int64(f.Id) }
这将输出:
1.2e+08 {Name:Fernando Id:120000000}
以上是如何在 Go 中处理带指数的 JSON 数字?的详细内容。更多信息请关注PHP中文网其他相关文章!