Heim >Backend-Entwicklung >Golang >Wie entmarshaliere ich numerische JSON-Werte mit Exponenten in Go?

Wie entmarshaliere ich numerische JSON-Werte mit Exponenten in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-15 13:59:03213Durchsuche

How to Unmarshal JSON Numeric Values with Exponents in Go?

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!

Stellungnahme:
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