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 中国語 Web サイトの他の関連記事を参照してください。