JSON-Unmarshal von numerischen Werten mit Exponenten
Golang-Benutzer können auf Schwierigkeiten stoßen, wenn sie versuchen, JSON-Strings in Go-Strukturen zu entmarshalieren, die numerische Werte mit Exponenten enthalten . Standardmäßig interpretiert Go diese Werte falsch, was zu einem Präzisionsverlust führt.
Demonstration des Problems
Bedenken Sie den folgenden Go-Code:
type Person struct { Id uint64 `json:"id"` Name string `json:"name"` } func parseJSON(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) // The numeric value with an exponent is lost. fmt.Println(person.Id) }
Wenn wir eine JSON-Zeichenfolge wie { „id“: 1.2E 8, „name“: „John“ } als Eingabe bereitstellen, gibt die parseJSON-Funktion 0 aus, was darauf hinweist, dass der Exponent ignoriert wird.
Lösung
Um dieses Problem zu beheben, passen Sie den Typ des Id-Felds auf einen Gleitkommatyp wie float64 an, wie unten gezeigt:
type Person struct { Id float64 `json:"id"` Name string `json:"name"` }
Diese Änderung ermöglicht „Gehe zu“. Interpretieren Sie den Exponenten korrekt und bewahren Sie den numerischen Wert.
Alternativer Ansatz mit Hooks
In Fällen, in denen eine Änderung des Feldtyps nicht möglich ist, können Sie eine Problemumgehung mit a anwenden „Dummy“-Feld und einen benutzerdefinierten Hook. Dieser Hook würde den Wert aus dem „Dummy“-Feld in den gewünschten Ganzzahltyp umwandeln.
type Person struct { Id float64 `json:"id"` _Id int64 Name string `json:"name"` } func parseJSONWithHook(jsonStr []byte) { var person Person json.Unmarshal(jsonStr, &person) if reflect.TypeOf(person._Id) == reflect.TypeOf((int64)(0)) { person._Id = int64(person.Id) } }
Wenn Sie beide Ansätze befolgen, können Sie numerische Werte mit Exponenten in Ihren Go-Programmen erfolgreich verarbeiten.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich numerische JSON-Werte mit Exponenten in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!