Lektionen des Moduls (4/5)
Feld-Tags und JSON
Tags für Strukturfelder sind Metadatenzeichenfolgen, die über Reflektion gelesen werden
durch Bibliotheken wie encoding/json, encoding/xml, Validatoren, ORMs. Sie
werden zwischen Backticks (Rohzeichenfolge) direkt nach dem Feldtyp geschrieben.
Syntax
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Formatkonvention: key:"value" durch Leerzeichen getrennt (NICHT
Kommas) für mehrere Schlüssel:
type User struct {
Email string `json:"email" validate:"required,email"`
}JSON-Tag: Optionen
Die häufigste Option ist json, die von encoding/json verwendet wird:
| Tag | Wirkung |
| ----------------------- | --------------------------------------------------- | ------------ |
| json:"nome" | Benennt das Feld in der JSON-Ausgabe | in nome um |
| json:"nome,omitempty" | Lässt das Feld weg, wenn es seinen Nullwert | hat |
| json:"-" | Dieses Feld nicht serialisieren/deserialisieren |
| json:",omitempty" | Behält den Go-Feldnamen bei, jedoch mit omitempty |
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
Password string `json:"-"`
}
u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b)) // {"nome":"Ada"}Age wird weggelassen (Nullwert 0 + omitempty); Password ist
gänzlich ausgeschlossen.
Marschall und Unmarschall
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal akzeptiert nur einen Zeiger, da in den geschrieben werden muss
Felder des Werts.
Andere gängige Tags
xml:"..."–encoding/xmlyaml:"..."– yaml.v3db:"..."– sqlx / pgxvalidate:"..."– Go-Playground/Validatorform:"..."– Gin/Echo-Bindung
Bibliotheken lesen sie durch Reflexion (reflect.StructTag.Get("json")):
Sie sind nur Zeichenfolgen, bis jemand sie interpretiert.
Probieren Sie es aus
Fügen Sie das Tag „json:“nome“ zum Feld „Name“ und das Tag „json:“eta“ zum Feld „Alter“ hinzu.
Hinweis anzeigen
Tags sind Rohzeichenfolgen zwischen Backticks direkt nach dem Feldtyp.
Lösung nach 3 Versuchen verfügbar
Fügen Sie dem Feld „Alter“ die Option „omitempty“ hinzu: Sie muss weggelassen werden, wenn sie 0 ist.
Hinweis anzeigen
Nach dem Namen stehen Optionen, getrennt durch ein Komma: json:"nome,omitempty".
Lösung nach 3 Versuchen verfügbar
Was wird mit den Tags json:"nome" und json:"eta" gedruckt?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Zusammenfassung
- Tags sind Rohzeichenfolgen zwischen Backticks:
`key:"value" key2:"value2"`. json:"nome": rename.omitempty: omit if zero value.-: exclude.- NON-exported (lowercase) fields are ignored by
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(pointer).- Same mechanism for
xml,yaml0db1validate2form, …