Мне нужно декодировать строку JSON с числом с плавающей запятой, например:
{"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 с помощью преобразования типа.
json:",string"
обязательна - без нее работать не будет."N": 1234
чтобыN: "1234"
?Просто сообщаю вам, что вы можете сделать это без
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) }
источник
Избегайте преобразования строки в [] байт:
b := []byte(s)
. Он выделяет новое пространство памяти и копирует в него все содержимое.strings.NewReader
интерфейс лучше. Ниже приведен код от godoc:package main import ( "encoding/json" "fmt" "io" "log" "strings" ) func main() { const jsonStream = ` {"Name": "Ed", "Text": "Knock knock."} {"Name": "Sam", "Text": "Who's there?"} {"Name": "Ed", "Text": "Go fmt."} {"Name": "Sam", "Text": "Go fmt who?"} {"Name": "Ed", "Text": "Go fmt yourself!"} ` type Message struct { Name, Text string } dec := json.NewDecoder(strings.NewReader(jsonStream)) for { var m Message if err := dec.Decode(&m); err == io.EOF { break } else if err != nil { log.Fatal(err) } fmt.Printf("%s: %s\n", m.Name, m.Text) } }
источник
Передача значения в кавычках делает его похожим на строку. + Изменить
"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) } }
источник
map[string]interface{}
дляUnmarshal
, и разобрать , что в вашу структуру.Unmarshal
, который вызывает по умолчаниюUnmarshal
сmap[string]interface{}
, но используетreflect
иstrconv
пакеты для выполнения синтаксического анализа.