Heim > Backend-Entwicklung > Golang > Wie kann ich Datentypen beim Parsen von JSON in Go beibehalten?

Wie kann ich Datentypen beim Parsen von JSON in Go beibehalten?

DDD
Freigeben: 2024-11-25 02:46:10
Original
728 Leute haben es durchsucht

How Can I Preserve Data Types When Parsing JSON in Go?

Erhaltung von Datentypen beim JSON-Parsing

Eine Herausforderung beim Parsen von JSON-Daten in Golang ist die automatische Konvertierung numerischer Werte in Gleitkommazahlen. Dies kann zu Inkonsistenzen mit den Originaldaten führen, insbesondere beim Umgang mit ganzzahligen Werten.

Um dieses Problem zu beheben, gibt es mehrere Techniken, um Datentypen während der JSON-Analyse beizubehalten.

Benutzerdefiniert JSON-Werte

Ein Ansatz besteht darin, den von Go bereitgestellten benutzerdefinierten JSON-Wertmechanismus zu verwenden. Dazu gehört die Erstellung eines benutzerdefinierten Typs, der die Schnittstellen json.Marshaler und json.Unmarshaler implementiert. Durch Überschreiben der Methoden MarshalJSON und UnmarshalJSON können Sie steuern, wie numerische Werte während der Serialisierung und Deserialisierung behandelt werden.

Go json.Number

Eine weitere Option ist die Verwendung von JSON .Number-Typ eingeführt in Go 1.8. Standardmäßig werden numerische Werte in JSON als float64 analysiert. Durch die Verwendung von json.Number und den Aufruf der Methoden Int64 oder Float64 können Sie die Zahl jedoch explizit in einen Ganzzahl- bzw. Gleitkommawert konvertieren.

Beispielimplementierung

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
    "strings"
)

type MyJSONNumber struct {
    json.Number
}

func (mn *MyJSONNumber) MarshalJSON() ([]byte, error) {
    if n, err := strconv.Atoi(string(mn.Number)); err == nil {
        return []byte(strconv.Itoa(n)), nil
    }
    return []byte(mn.Number), nil
}

func (mn *MyJSONNumber) UnmarshalJSON(b []byte) error {
    if n, err := strconv.Atoi(string(b)); err == nil {
        mn.Number = strconv.Itoa(n)
        return nil
    }
    mn.Number = string(b)
    return nil
}

func main() {
    str := `{"a":123,"b":12.3,"c":"123","d":"12.3","e":true}`
    var raw map[string]json.RawMessage
    err := json.Unmarshal([]byte(str), &raw)
    if err != nil {
        panic(err)
    }
    parsed := make(map[string]interface{}, len(raw))
    for key, val := range raw {
        s := string(val)
        jnum := MyJSONNumber{json.Number(s)}
        n, err := jnum.Int64()
        if err == nil {
            parsed[key] = n
            continue
        }
        f, err := jnum.Float64()
        if err == nil {
            parsed[key] = f
            continue
        }
        var v interface{}
        err = json.Unmarshal(val, &v)
        if err == nil {
            parsed[key] = v
            continue
        }
        parsed[key] = val
    }
    for key, val := range parsed {
        fmt.Printf("%T: %v %v\n", val, key, val)
    }
}
Nach dem Login kopieren

Ausgabe:

int64: a 123
float64: b 12.3
string: c 123
string: d 12.3
bool: e true
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich Datentypen beim Parsen von JSON in Go beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage