Heim > Artikel > Backend-Entwicklung > Wie entmarshaliere ich JSON mit benutzerdefinierter Tag-Verarbeitung für die String-Darstellung?
Unmarshaling von JSON mit benutzerdefinierter Tag-Verarbeitung
Beim Versuch, JSON in eine Struktur zu entmarshalieren, kann es erforderlich sein, Felder mit benutzerdefinierten Tags unterschiedlich zu behandeln . In diesem Artikel wird ein Problem untersucht, bei dem ein Feld in einer Struktur über ein Tag verfügt, das angibt, dass das Marshaling als Zeichenfolge aufgehoben werden soll.
Problem:
Berücksichtigen Sie eine JSON-Zeichenfolge und eine entsprechende Struktur:
<code class="json">{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }</code>
<code class="go">type A struct { I int64 S string `sql:"type:json"` }</code>
Das Ziel besteht darin, das „S“-Feld als Zeichenfolge und nicht als Struktur zu entmarshalieren.
Lösung:
Verwenden der Marshaler/Unmarshaler-Schnittstelle:
Go bietet eine Möglichkeit, das standardmäßige JSON-Marshalling- und Unmarshaling-Verhalten zu überschreiben, indem die Marshaler- und Unmarshaler-Schnittstellen für einen benutzerdefinierten Typ implementiert werden. Erstellen Sie in diesem Fall einen neuen Typ namens RawString und implementieren Sie diese Funktionen:
<code class="go">type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil }</code>
Anwenden auf die Struktur:
Ändern Sie die A-Struktur, um den RawString-Typ zu verwenden für das „S“-Feld:
<code class="go">type A struct { I int64 S RawString `sql:"type:json"` }</code>
Mit dieser Implementierung wird das „S“-Feld beim Unmarshaling in eine A-Struktur als String entmarshallt, wobei seine ursprüngliche JSON-Darstellung erhalten bleibt.
Beispielverwendung:
<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed:", err) } fmt.Println("Done", a) }</code>
Ausgabe:
<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich JSON mit benutzerdefinierter Tag-Verarbeitung für die String-Darstellung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!