По умолчанию числа с плавающей запятой отображаются без десятичной точки и дробей, если их значение является целым числом.Представление короче и означает одно и то же число.
Если вы хотите контролировать отображение числа в представлении JSON, используйте тип json.Number
.
Пример:
type Pt struct {
Value json.Number
Unit string
}
func main() {
data, err := json.Marshal(Pt{json.Number("40.0"), "some_string"})
fmt.Println(string(data), err)
}
Вывод (попробуйте на Go Playground ):
{"Value":40.0,"Unit":"some_string"} <nil>
Если у вас есть число в качестве значения float64
, выможет преобразовать его в json.Number
следующим образом:
func toNumber(f float64) json.Number {
var s string
if f == float64(int64(f)) {
s = fmt.Sprintf("%.1f", f) // 1 decimal if integer
} else {
s = fmt.Sprint(f)
}
return json.Number(s)
}
Тестирование:
f := 40.0
data, err := json.Marshal(Pt{toNumber(f), "some_string"})
fmt.Println(string(data), err)
f = 40.123
data, err = json.Marshal(Pt{toNumber(f), "some_string"})
fmt.Println(string(data), err)
Вывод (попробуйте на Go Playground ):
{"Value":40.0,"Unit":"some_string"} <nil>
{"Value":40.123,"Unit":"some_string"} <nil>
В другом направлении, если вам нужно float64
значение json.Number
, просто вызовите его метод Number.Float64()
.