指数を含む数値の 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 などの -point 型:
type Person struct { Id float64 `json:"id"` Name string `json:"name"` }
この変更により、Go が正しく解釈できるようになります。
フックを使用した代替アプローチ
フィールド タイプの変更が不可能な場合は、「ダミー」を使用する回避策を採用できます。フィールドとカスタムフック。このフックは、「ダミー」フィールドの値を目的の整数型にキャストします。
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 中国語 Web サイトの他の関連記事を参照してください。