Как декодировать JSON с преобразованием типа из строки в float64 в Golang?
Мне нужно декодировать строку JSON с номером float, например:
{"name":"Galaxy Nexus", "price":"3460.00"}
Я использую код Голанга ниже:
package main
import (
"encoding/json"
"fmt"
)
type Product struct {
Name string
Price float64
}
func main() {
s := `{"name":"Galaxy Nexus", "price":"3460.00"}`
var pro Product
err := json.Unmarshal([]byte(s), &pro)
if err == nil {
fmt.Printf("%+v\n", pro)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", pro)
}
}
Когда я запустил его, получите результат:
json: cannot unmarshal string into Go value of type float64
{Name:Galaxy Nexus Price:0}
Я хочу знать, как декодировать строку JSON с преобразованием типа.
Ответы
Ответ 1
Ответ значительно менее сложный. Просто добавьте, скажите, что JSON-интерпретатор это строка, закодированная float64 с ,string
(обратите внимание, что я только изменил определение Price
):
package main
import (
"encoding/json"
"fmt"
)
type Product struct {
Name string
Price float64 `json:",string"`
}
func main() {
s := `{"name":"Galaxy Nexus", "price":"3460.00"}`
var pro Product
err := json.Unmarshal([]byte(s), &pro)
if err == nil {
fmt.Printf("%+v\n", pro)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", pro)
}
}
Ответ 2
Передача значения в кавычки делает это похожим на строку. Измените "price":"3460.00"
на "price":3460.00
, и все будет хорошо.
Если вы не можете отбросить отметки кавычек, вы должны сами проанализировать их, используя strconv.ParseFloat
:
package main
import (
"encoding/json"
"fmt"
"strconv"
)
type Product struct {
Name string
Price string
PriceFloat float64
}
func main() {
s := `{"name":"Galaxy Nexus", "price":"3460.00"}`
var pro Product
err := json.Unmarshal([]byte(s), &pro)
if err == nil {
pro.PriceFloat, err = strconv.ParseFloat(pro.Price, 64)
if err != nil { fmt.Println(err) }
fmt.Printf("%+v\n", pro)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", pro)
}
}
Ответ 3
Просто сообщите, что вы можете сделать это без Unmarshal
и использовать json.decode
. Вот Перейти на игровой площадке
package main
import (
"encoding/json"
"fmt"
"strings"
)
type Product struct {
Name string `json:"name"`
Price float64 `json:"price,string"`
}
func main() {
s := `{"name":"Galaxy Nexus","price":"3460.00"}`
var pro Product
err := json.NewDecoder(strings.NewReader(s)).Decode(&pro)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(pro)
}