Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit JSON-Zahlen mit Exponenten in Go um?

Wie gehe ich mit JSON-Zahlen mit Exponenten in Go um?

Susan Sarandon
Susan SarandonOriginal
2024-11-17 08:03:03269Durchsuche

How to Handle JSON Numerals with Exponents in Go?

JSON-Zahlen mit Exponenten in Go dekodieren

Beim Unmarshaling von JSON-Daten in eine Go-Struktur werden numerische Werte mit Exponenten oft fälschlicherweise als Null interpretiert. Dies tritt auf, wenn das Zielfeld in der Struktur als Ganzzahltyp deklariert ist.

Um dieses Problem zu beheben, führen Sie die folgenden Schritte aus:

  1. Ändern Sie den Feldtyp: Ändern Sie den Typ des Feldes, in dem der numerische Wert mit Exponent gespeichert wird, von uint64 in float32 oder float64. Zum Beispiel:
type Person struct {
    Id   float32  `json:"id"`
    Name string `json:"name"`
}
  1. Unmarshaling des JSON: Führen Sie den Unmarshaling-Vorgang wie gewohnt mit der json.Unmarshal-Funktion durch. Die numerischen Werte mit Exponenten werden nun korrekt interpretiert.

Hier ist ein Beispiel:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

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

func main() {

    // Create the JSON string.
    var b = []byte(`{"id": 1.2E+8, "Name": "Fernando"}`)

    // Unmarshal the JSON to a proper struct.
    var f Person
    json.Unmarshal(b, &f)

    // Print the person.
    fmt.Println(f)

    // Unmarshal the struct to JSON.
    result, _ := json.Marshal(f)

    // Print the JSON.
    os.Stdout.Write(result)
}

Dies wird ausgegeben:

{1.2e+08 Fernando}
{"id":1.2e+08,"Name":"Fernando"}

Alternativer Ansatz:

Wenn Sie einen Ganzzahltyp für das Feld verwenden müssen, können Sie ein „Dummy“-Feld vom Typ float64 verwenden, um den numerischen Wert mit Exponenten zu erfassen. Verwenden Sie dann einen Hook, um den Wert in den tatsächlichen Ganzzahltyp umzuwandeln.

Hier ist ein Beispiel:

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

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)
}

Dies wird ausgegeben:

1.2e+08
{Name:Fernando Id:120000000}

Das obige ist der detaillierte Inhalt vonWie gehe ich mit JSON-Zahlen mit Exponenten 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