Heim >Backend-Entwicklung >Golang >Wie entmarshaliere ich JSON in eine Struktur mit einem Feld, das mit „json' markiert ist?

Wie entmarshaliere ich JSON in eine Struktur mit einem Feld, das mit „json' markiert ist?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 00:02:02276Durchsuche

How to Unmarshal JSON into a Struct with a Field Tagged with

Unmarshaling von JSON in eine Struktur mit einem Feld, das mit „json“ getaggt 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.

Verwendung von benutzerdefinierten Typen und Marshal/Unmarshal-Methoden

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.

Marshaling und Unmarshaling des JSON

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!

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