Расшифруйте до map[string]interface{}
с помощью опции UseNumber . Используйте утверждение типа , чтобы найти числа и конвертировать их в зависимости от наличия символа ".".
dec := json.NewDecoder(r)
dec.UseNumber()
var m map[string]interface{}
err := dec.Decode(&m)
if err != nil {
log.Fatal(err)
}
for k, v := range m {
v, err := decodeValue(v)
if err != nil {
log.Fatal(err)
}
for k, v := range m {
v, err := decodeValue(v)
if err != nil {
log.Fatal(err)
}
switch v := v.(type) {
case string:
fmt.Printf("%s is a string with value %q\n", k, v)
case int64:
fmt.Printf("%s is a integer with value %d\n", k, v)
case float64:
fmt.Printf("%s is a float with value %f\n", k, v)
default:
fmt.Printf("%s is a %T with value %v\n", k, v, v)
}
}
...
func decodeValue(v interface{}) (interface{}, error) {
if vv, ok := v.(json.Number); ok {
if strings.Contains(vv.String(), ".") {
return vv.Float64()
} else {
return vv.Int64()
}
} else {
return v, nil
}
}
Запустите его на детской площадке .
В этом примере распечатывается то, что было найдено, и выходит из программы в случае ошибки. Если ваша цель - создать карту со значениями правильных типов, замените код, который печатает числа, на m[k] = n
.