Golang を使用した JSON 内の整数を整数として、浮動小数点を浮動小数点数として解析する
転送先の JSON レコードのストリームを受信する Golang アプリケーション内データ ストア (InfluxDB) では、元の整数データ型を保持することが重要ですおよび float 値を使用して型の競合を回避し、書き込み操作を確実に成功させます。 Ruby JSON パーサーはこのタスクを簡単に実行しますが、Golang のエンコーディング/json パッケージは最初にすべての数値を浮動小数点数として解析するため、型の不一致や書き込みエラーが発生する可能性があります。
カスタム JSON 値を使用した回避策
Ruby JSON パーサーの動作を複製するための 1 つのアプローチは、カスタム JSON 値に汎用の Go メカニズムを利用することです。このメソッドでは、JSON 数値はバイト配列 (json.RawMessage) として表され、strconv.ParseInt および strconv.ParseFloat を使用して解析されます。これにより、整数と浮動小数点の正確な変換が可能になります:
import ( "encoding/json" "fmt" "strconv" ) func main() { str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}` var raw map[string]json.RawMessage err := json.Unmarshal([]byte(str), &raw) if err != nil { panic(err) } parsed := make(map[string]interface{}, len(raw)) for key, val := range raw { s := string(val) i, err := strconv.ParseInt(s, 10, 64) if err == nil { parsed[key] = i continue } f, err := strconv.ParseFloat(s, 64) if err == nil { parsed[key] = f continue } var v interface{} err = json.Unmarshal(val, &v) if err == nil { parsed[key] = v continue } parsed[key] = val } for key, val := range parsed { fmt.Printf("%T: %v %v\n", val, key, val) } }
出力:
int64: a 123 float64: b 12.3 string: c 123 string: d 12.3 bool: e true
json.Number 型の使用
別のアプローチには、Go json.Number タイプを使用することが含まれます。これにより、効率的なJSON データから直接整数と浮動小数点数の両方を解析:
import ( "encoding/json" "fmt" "strings" ) func main() { str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}` var parsed map[string]interface{} d := json.NewDecoder(strings.NewReader(str)) d.UseNumber() err := d.Decode(&parsed) if err != nil { panic(err) } for key, val := range parsed { n, ok := val.(json.Number) if !ok { continue } if i, err := n.Int64(); err == nil { parsed[key] = i continue } if f, err := n.Float64(); err == nil { parsed[key] = f continue } } for key, val := range parsed { fmt.Printf("%T: %v %v\n", val, key, val) } }
出力:
int64: a 123 float64: b 12.3 string: c 123 string: d 12.3 bool: e true
これらのメソッドは、元のデータ型を保持するための効果的なソリューションを提供します。 Golang での JSON 解析中に整数と浮動小数点を解析し、正確で信頼性の高いデータ処理を保証します。
以上がGolang で JSON から整数と浮動小数点を正確に解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。