Golang JSON-Unmarshal-Fehler: Numerische Werte mit Exponenten geben 0 zurück
Beim Versuch, JSON-Daten in eine Go-Struktur zu entmarshalieren, sind Benutzer auf einen Fehler gestoßen Problem, bei dem numerische Werte mit Exponenten durchgängig als 0 interpretiert werden. Dieses Verhalten ist auf eine Nichtübereinstimmung zwischen dem erwarteten Typ und dem tatsächlichen Wert zurückzuführen.
Zum Beispiel, wenn eine JSON-Zeichenfolge wie {"id": 1.2e 8 , „Name“: „Fernando“} soll in eine Struktur mit einem Id-Feld vom Typ uint64 entmarshallt werden, die resultierende Id ist 0.
Lösung
Um dieses Problem zu beheben, stellen Sie sicher, dass der Typ des Felds in der Struktur mit dem Typ der Daten in der JSON-Zeichenfolge übereinstimmt. Da in diesem Fall Exponenten verwendet werden, sollte das Id-Feld als Gleitkommatyp wie float32 oder float64 definiert werden.
Alternative Lösung
Für Situationen, in denen die Wenn der erwartete Typ nicht mit dem numerischen JSON-Format kompatibel ist, kann eine Problemumgehung implementiert werden. Durch Hinzufügen eines „Dummy“-Felds des gewünschten Typs kann ein Hook verwendet werden, um den Wert in den tatsächlich erwarteten Typ umzuwandeln.
Zum Beispiel:
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` }
Nach dem Unmarshalling der JSON-Daten In die Person-Struktur kann eine bedingte Prüfung hinzugefügt werden, um das Id-Feld in int64 umzuwandeln.
var f Person var b = []byte(`{"id": 1.2e+8, "Name": "Fernando"}`) _ = json.Unmarshal(b, &f) if reflect.TypeOf(f._Id) == reflect.TypeOf((int64)(0)) { fmt.Println(f.Id) f._Id = int64(f.Id) }
Dieser Hacky-Ansatz ermöglicht die Konvertierung des Gleitkomma-Id-Felds in den gewünschten int64-Typ.
Das obige ist der detaillierte Inhalt vonWarum macht Golang JSON einen Unmarshal-Fehler, wenn numerische Werte mit Exponenten gefunden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!