Heim >Backend-Entwicklung >Golang >Wie kann ich in Go zwischen Null- und fehlenden JSON-Feldern unterscheiden?

Wie kann ich in Go zwischen Null- und fehlenden JSON-Feldern unterscheiden?

Susan Sarandon
Susan SarandonOriginal
2024-12-01 13:24:12162Durchsuche

How Can I Differentiate Between Null and Absent JSON Fields in Go?

Unterscheidung von Null- und fehlenden JSON-Feldern in Go

In Go entstehen beim Unmarshalling von JSON-Daten in eine Struktur sowohl Nullfelder als auch fehlende Felder in Nullwerten in der resultierenden Struktur. Dies kann eine Herausforderung sein, wenn es wichtig ist, zwischen den beiden Szenarien zu unterscheiden, z. B. wenn ein Feld, das null ist, eine bestimmte Absicht anzeigt, während sein Fehlen darauf hinweist, dass es nie vorhanden war.

Verwendung optionaler Strukturen (Go 1.18)

Für Go 1.18 und höher ermöglichen Generika eine unkomplizierte Lösung mithilfe einer benutzerdefinierten Struktur: Optional[T]. Diese Struktur enthält ein definiertes boolesches Feld, das das Vorhandensein des Felds in der JSON-Nutzlast angibt, und ein Wertfeld, das den tatsächlichen Wert enthält. Wenn beim Unmarshalling der Wert definiert (nicht null) ist, wird UnmarshalJSON aufgerufen und die Felder „Definiert“ und „Wert“ entsprechend festgelegt.

type Optional[T any] struct {
    Defined bool
    Value   *T
}
type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[bool]   `json:"field2"`
    Field3 Optional[int32]  `json:"field3"`
}

Durch Überprüfen des Felds „Definiert“ können Sie erkennen, ob ein Feld vorhanden war null oder undefiniert.

Benutzerdefinierter Unmarshaler mit Vor-Generika

Vor Go 1.18 kann zu diesem Zweck ein benutzerdefinierter Unmarshaler verwendet werden:

type OptionalString struct {
    Defined bool
    Value   *string
}

func (os *OptionalString) UnmarshalJSON(data []byte) error {
    // UnmarshalJSON is called only if the key is present
    os.Defined = true
    return json.Unmarshal(data, &os.Value)
}
type Payload struct {
    SomeField1 string         `json:"somefield1"`
    SomeField2 OptionalString `json:"somefield2"`
}

Bei diesem Ansatz implementiert die OptionalString-Struktur den JSON. Unmarshaler-Schnittstelle, Einstellung „Definiert“ auf „true“, wenn das Feld in der JSON-Nutzlast vorhanden ist. Dies ermöglicht die Unterscheidung zwischen Feldern, die null sind, und solchen, die nicht vorhanden sind.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go zwischen Null- und fehlenden JSON-Feldern unterscheiden?. 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