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:
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
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!