Golang Json Unmarshal Numeric with Exponent
JSON 文字列を指数付きの数値を含む構造体にアンマーシャリングする場合、指数がは一貫して 0 に切り捨てられます。この問題は、 struct フィールドが JSON のデータ型と一致しません。
この例では、person struct の Id フィールドは、符号なし 64 ビット整数を表す uint64 として定義されています。ただし、JSON 文字列の値は科学表記法 (1.2E 8) の 10 進数です。
Go は指数付き 10 進数を符号なし 64 ビット整数に自動的に変換できないため、結果は次のように切り捨てられます。 0.
解決方法問題
この問題を解決するには、JSON 文字列のデータ型と一致するように ID フィールドの型を変更できます。この場合、数値は 10 進数であるため、float32 または float64 を使用できます。
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
型を float32 または float64 に更新することで、Go は指数を含む数値を正しく解釈して割り当てることができるようになりました。
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 中国語 Web サイトの他の関連記事を参照してください。