Heim > Backend-Entwicklung > Golang > Wie entmarshaliere ich JSON mit benutzerdefinierter Tag-Verarbeitung für die String-Darstellung?

Wie entmarshaliere ich JSON mit benutzerdefinierter Tag-Verarbeitung für die String-Darstellung?

Linda Hamilton
Freigeben: 2024-10-31 08:37:29
Original
450 Leute haben es durchsucht

How to Unmarshal JSON with Custom Tag Handling for String Representation?

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>
Nach dem Login kopieren
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ausgabe:

<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage