Ich versuche, einen Wert von einem JSON abzurufen und in int umzuwandeln, aber es funktioniert nicht und ich weiß nicht, wie ich es richtig machen soll.
Hier ist die Fehlermeldung:
...cannot convert val (type interface {}) to type int: need type assertion
Und der Code:
var f interface{}
err = json.Unmarshal([]byte(jsonStr), &f)
if err != nil {
utility.CreateErrorResponse(w, "Error: failed to parse JSON data.")
return
}
m := f.(map[string]interface{})
val, ok := m["area_id"]
if !ok {
utility.CreateErrorResponse(w, "Error: Area ID is missing from submitted data.")
return
}
fmt.Fprintf(w, "Type = %v", val) // <--- Type = float64
iAreaId := int(val) // <--- Error on this line.
testName := "Area_" + iAreaId // not reaching here
Ich gehe davon aus: Wenn Sie den JSON-Wert über den Browser gesendet haben, ist jede Nummer, die Sie gesendet haben, vom Typ float64, sodass Sie den Wert nicht direkt in golang erhalten können.
So macht die Konvertierung wie:
Auf diese Weise erhalten Sie genau den Wert, den Sie wollten.
quelle
Hinzufügen einer weiteren Antwort, die verwendet
switch
... Es gibt umfassendere Beispiele, aber dies gibt Ihnen die Idee.Wird beispielsweise
t
der angegebene Datentyp in jedemcase
Bereich. Beachten Sie, dass Siecase
für einen Typ nur einen Typ angeben müssen, andernfallst
bleibt eininterface
.quelle
case string
, können Siestrconv.ParseFloat(t, 32)
und werfen dann das Ergebnis in eineint
Ich von ganzem Herzen zustimmen zzzz ‚s Art Behauptung Antwort und ich ziehe stark auf diese Weise über andere. Das heißt, ich musste Folgendes tun, wenn die bevorzugte Methode nicht funktioniert hat ... (lange Geschichte im Zusammenhang mit der Kreuzserialisierung von Daten). Sie können dies sogar zu einer
switch
Anweisung mitcase errInt == nil
und ähnlichen Ausdrücken verketten.Versuchen Sie, wie oben erwähnt, zuerst die Typzusicherung, bevor Sie dies versuchen.
quelle
strconv.ParseFloat(v.(string), 64)
stattdessen. Möglicherweise möchten Sie auch Variablennamen ändernerrFloat
.Ich habe eine Bibliothek geschrieben, die bei der Typkonvertierung https://github.com/KromDaniel/jonson helfen kann
quelle
Am einfachsten habe ich das gemacht. Nicht der beste Weg, aber der einfachste Weg, wie ich weiß.
quelle
Sie müssen eine Typzusicherung durchführen, um Ihre Schnittstelle {} in einen int-Wert zu konvertieren.
Weitere Informationen sind verfügbar .
quelle
Vielleicht brauchst du
quelle
Um die Typkonvertierung besser zu verstehen, sehen Sie sich den folgenden Code an:
Dieser Code wird perfekt ausgeführt und konvertiert den Schnittstellentyp in den Int-Typ
Gehen Sie zurück zu Ihrem Code
iAreaId := val.(int)
sollte gut funktionieren. Wenn Sie überprüfen möchten, ob während der Konvertierung ein Fehler aufgetreten ist, können Sie die obige Zeile auch als neu schreiben
iAreaId, ok := val.(int)
quelle
Vermeiden Sie am besten das Casting, indem Sie f als den richtigen Typ deklarieren, der dem JSON entspricht.
quelle