Как декодировать JSON с типом convert from string to float64 в Golang?
мне нужно декодировать строку JSON с номером float, например:
{"name":"Galaxy Nexus", "price":"3460.00"}
Я использую код Golang ниже:
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("%+vn", pro)
} else {
fmt.Println(err)
fmt.Printf("%+vn", pro)
}
}
когда я запускаю его, получаем результат:
json: cannot unmarshal string into Go value of type float64
{Name:Galaxy Nexus Price:0}
Я хочу знать, как декодировать строку JSON с типом convert.
3 ответа:
ответ значительно менее сложным. Просто добавьте скажите JSON interpeter, что это строка, закодированная 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) } }
передача значения в кавычках делает его похожим на строку. Изменить
"price":"3460.00"
to"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) } }
просто давая вам знать, что вы можете сделать это без
Unmarshal
и использоватьjson.decode
. Вот это Go Playgroundpackage 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) }