Warum macht Golang JSON einen Unmarshal-Fehler, wenn numerische Werte mit Exponenten gefunden werden?

Mary-Kate Olsen
Freigeben: 2024-11-15 19:21:02
Original
675 Leute haben es durchsucht

Why Does Golang JSON Unmarshal Error When Encountering Numeric Values with Exponents?

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 Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage