Ich muss eine JSON-Zeichenfolge mit der Gleitkommazahl wie folgt dekodieren:
{"name":"Galaxy Nexus", "price":"3460.00"}
Ich benutze den folgenden Golang-Code:
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)
}
}
Wenn ich es ausführe, erhalte ich das Ergebnis:
json: cannot unmarshal string into Go value of type float64
{Name:Galaxy Nexus Price:0}
Ich möchte wissen, wie die JSON-Zeichenfolge mit dem Typ convert dekodiert wird.
json:",string"
erforderlich ist - ohne dieses Komma funktioniert es nicht."N": 1234
zuN: "1234"
?Lassen Sie Sie einfach wissen, dass Sie dies ohne
Unmarshal
und verwenden könnenjson.decode
. Hier ist 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) }
quelle
Wenn Sie einen Wert in Anführungszeichen setzen, sieht dieser wie eine Zeichenfolge aus. Wechseln Sie
"price":"3460.00"
zu"price":3460.00
und alles funktioniert gut.Wenn Sie die Anführungszeichen nicht löschen können, müssen Sie sie selbst analysieren, indem Sie Folgendes verwenden
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) } }
quelle
map[string]interface{}
für verwendenUnmarshal
und diese in Ihre Struktur analysieren.Unmarshal
, die standardmäßigUnmarshal
mit a aufrufenmap[string]interface{}
, aber das Parsing verwendenreflect
undstrconv
paketieren.Vermeiden Sie die Konvertierung eines Strings in [] Byte :
b := []byte(s)
. Es weist einen neuen Speicherplatz zu und kopiert den gesamten Inhalt hinein.strings.NewReader
Schnittstelle ist besser. Unten ist der Code von 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) } }
quelle