Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit Exponenten im JSON-Unmarshaling für numerische Werte in Go um?

Wie gehe ich mit Exponenten im JSON-Unmarshaling für numerische Werte in Go um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-23 07:04:23742Durchsuche

How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?

Golang Json Unmarshal Numeric with Exponent

Beim Unmarshaling von JSON-Strings in Strukturen, die numerische Werte mit Exponenten enthalten, kann es vorkommen, dass der Exponent wird konsequent auf 0 gekürzt. Dieses Problem kann auftreten, wenn der Typ Ihres Strukturfelds nicht mit dem Datentyp in übereinstimmt das JSON.

Im bereitgestellten Beispiel ist das Id-Feld der Person-Struktur als uint64 definiert, was vorzeichenlose 64-Bit-Ganzzahlen darstellt. Der Wert im JSON-String ist jedoch eine Dezimalzahl in wissenschaftlicher Notation (1.2E 8).

Da Go eine Dezimalzahl mit einem Exponenten nicht automatisch in eine vorzeichenlose 64-Bit-Ganzzahl umwandeln kann, wird das Ergebnis auf gekürzt 0.

So lösen Sie das Problem

Um dieses Problem zu beheben Bei diesem Problem können Sie den Typ des Id-Felds so ändern, dass er mit dem Datentyp in der JSON-Zeichenfolge übereinstimmt. Da es sich in diesem Fall um eine Dezimalzahl handelt, können Sie float32 oder float64 verwenden:

type Person struct {
    Id   float32 `json:"id"`
    Name string `json:"name"`
}

Durch die Aktualisierung des Typs auf float32 oder float64 kann Go nun den numerischen Wert mit einem Exponenten korrekt interpretieren und zuweisen in das Id-Feld der Personenstruktur.

Wenn Sie alternativ den ursprünglichen Ganzzahltyp für Id beibehalten möchten, können Sie ein benutzerdefiniertes JSON verwenden Unmarshaler-Hook. Dieser Hook kann den Gleitkommawert in eine Ganzzahl umwandeln, bevor er dem Feld zugewiesen wird:

type Person struct {
    Id   int64  `json:"id"`
    Name string `json:"name"`
}

func (p *Person) UnmarshalJSON(b []byte) error {
    type Alias Person
    var a Alias

    if err := json.Unmarshal(b, &a); err != nil {
        return err
    }

    // Convert the float64 Id to int64
    p.Id = int64(a.Id)

    return nil
}

Mit dem benutzerdefinierten Unmarshaler wird der numerische Wert mit einem Exponenten in der JSON-Zeichenfolge korrekt konvertiert und zugewiesen das ID-Feld der Personenstruktur.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Exponenten im JSON-Unmarshaling für numerische Werte in Go um?. 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