Heim > Artikel > Backend-Entwicklung > Wie entmarshaliere ich JSON in eine Struktur mit einem Feld, das mit „json“ markiert ist?
Beim Versuch, JSON in eine Struktur zu entmarshalieren, kann es zu einem Szenario kommen, in dem ein bestimmtes Feld vorhanden ist ein „json“-Tag. Dieses Tag erfordert eine besondere Behandlung, um sicherzustellen, dass die JSON-Daten korrekt in das gewünschte Zeichenfolgenformat innerhalb der Struktur konvertiert werden.
Im bereitgestellten Beispiel verfügt die Struktur A über ein Feld S, das mit sql:"type:json" getaggt ist. Das Ziel besteht darin, den Wert von „S“ in den bereitgestellten JSON-Daten in ein Zeichenfolgenformat innerhalb der A-Struktur zu entpacken.
Anfangs haben Sie vielleicht darüber nachgedacht, Reflektion zu verwenden, um zu überprüfen, ob ein Feld-Tag die Zeichenfolge „json“ enthält " und entpacken Sie dann die JSON-Daten als Zeichenfolge in dieses Feld. Ein effizienterer und eleganterer Ansatz ist jedoch die Verwendung der Standardbibliotheksfunktionen von Go.
Eine Möglichkeit, dies zu erreichen, besteht darin, einen benutzerdefinierten Typ RawString zu definieren und zu implementieren Methoden MarshalJSON und UnmarshalJSON dafür. Diese Methoden bieten eine Möglichkeit zu steuern, wie JSON-Daten kodiert bzw. dekodiert werden.
In diesem Beispiel umschließt der RawString-Typ einen Zeichenfolgenwert. Die MarshalJSON-Methode gibt den String-Wert als Byte-Slice zurück, während die UnmarshalJSON-Methode die empfangenen Daten an den vorhandenen RawString anhängt.
Der nächste Schritt besteht darin, das A zu definieren Struktur, die das I-Feld (eine 64-Bit-Ganzzahl) und das S-Feld vom Typ RawString enthält.
Mit diesen benutzerdefinierten Typen und Methoden können Sie die bereitgestellten JSON-Daten in der A-Struktur entmarshalieren. Der folgende Go-Code demonstriert dies:
<code class="go">import ( "encoding/json" "fmt" "log" ) // RawString is a raw encoded JSON object. // It implements Marshaler and Unmarshaler and can // be used to delay JSON decoding or precompute a JSON encoding. type RawString string // MarshalJSON returns *m as the JSON encoding of m. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } // UnmarshalJSON sets *m to a copy of data. func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil } const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed", err) } fmt.Println("Done", a) }</code>
Mit diesem Ansatz können Sie JSON-Daten effektiv in eine Struktur mit einem mit „json“ getaggten Feld entpacken und das ursprüngliche Zeichenfolgenformat beibehalten.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich JSON in eine Struktur mit einem Feld, das mit „json“ markiert ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!