Benutzerdefiniertes Marshalling für abgeflachte sql.NullString-Ausgabe
Beim Marshalling eines sql.NullString-Felds in einer Go-Struktur mit json.Marshal, der Standardeinstellung Die Ausgabe enthält zusätzliche Metadaten wie die Felder „Valid“ und „String“. Dieses Verhalten ist in bestimmten Szenarios, in denen der abgeflachte Wert bevorzugt wird, möglicherweise nicht erwünscht.
Beachten Sie die folgende Struktur:
type Company struct { ID int `json:"id"` Abn sql.NullString `json:"abn,string"` }
Beim Marshalling dieser Struktur ähnelt das Ergebnis dem folgenden:
{ "id": "68", "abn": { "String": "SomeABN", "Valid": true } }
Das gewünschte Ergebnis ist jedoch eine abgeflachte Version mit nur Wert:
{ "id": "68", "abn": "SomeABN" }
Benutzerdefinierte Marshaller-Implementierung
Um dies zu erreichen, ist es notwendig, einen benutzerdefinierten Typ zu implementieren, der sql.NullString einbettet und die json.Marshaler-Schnittstelle implementiert . Dieser benutzerdefinierte Typ kann sein eigenes Marshalling-Verhalten über die MarshalJSON-Methode definieren.
Hier ein Beispiel:
type MyNullString struct { sql.NullString } func (s MyNullString) MarshalJSON() ([]byte, error) { if s.Valid { return json.Marshal(s.String) } return []byte(`null`), nil } type Company struct { ID int `json:"id"` Abn MyNullString `json:"abn,string"` }
Durch die Verwendung des benutzerdefinierten MyNullString-Typs erzeugt das Marshalling nun das gewünschte abgeflachte Ergebnis:
company := &Company{} company.ID = 68 company.Abn.String = "SomeABN" result, err := json.Marshal(company)
{ "id": "68", "abn": "SomeABN" }
Das obige ist der detaillierte Inhalt vonWie kann ich die JSON-Ausgabe von sql.NullString in Go reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!