Wie implementiert man UnmarshalJSON für abgeleitete Skalartypen in Go?

Patricia Arquette
Freigeben: 2024-11-26 18:41:16
Original
389 Leute haben es durchsucht

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

UnmarshalJSON-Implementierung für abgeleitete Skalare in Go

Problem:
Ein benutzerdefinierter Typ, der subtypisierte Ganzzahlkonstanten konvertiert zu Strings und umgekehrt erfordert ein automatisches Unmarshalling von JSON-Strings. Dies ist eine Herausforderung, da UnmarshalJSON keine Möglichkeit bietet, den Skalarwert ohne Verwendung einer Struktur zu ändern.

Lösung:
Berücksichtigen Sie die folgenden Schritte, um UnmarshalJSON für einen abgeleiteten Skalartyp zu implementieren :

Verwenden Sie einen Zeiger Empfänger:
Verwenden Sie einen Zeigerempfänger für die UnmarshalJSON-Methode, um den Wert des Empfängers zu ändern.

Unmarshalieren zu einem String:
Unmarshalieren Sie den JSON-Text in a einfache Zeichenfolge, wobei alle JSON-Zitate entfernt werden.

Suchen und Festlegen Wert:
Verwenden Sie die Lookup-Funktion, um die entsprechende PersonID basierend auf dem Zeichenfolgenwert abzurufen. Ordnen Sie das Ergebnis dem Empfänger zu.

Beispiel:

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}
Nach dem Login kopieren

Codebeispiel:

package main

import (
    "encoding/json"
    "fmt"
)

type PersonID int

const (
    Bob PersonID = iota
    Jane
    Ralph
    Nobody = -1
)

var nameMap = map[string]PersonID{
    "Bob":    Bob,
    "Jane":   Jane,
    "Ralph":  Ralph,
    "Nobody": Nobody,
}

var idMap = map[PersonID]string{
    Bob:    "Bob",
    Jane:   "Jane",
    Ralph:  "Ralph",
    Nobody: "Nobody",
}

func (intValue PersonID) Name() string {
    return idMap[intValue]
}

func Lookup(name string) PersonID {
    return nameMap[name]
}

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

type MyType struct {
    Person   PersonID `json: "person"`
    Count    int      `json: "count"`
    Greeting string   `json: "greeting"`
}

func main() {
    var m MyType
    if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
        fmt.Println(err)
    } else {
        for i := 0; i < m.Count; i++ {
            fmt.Println(m.Greeting, m.Person.Name())
        }
    }
}
Nach dem Login kopieren

Ausgabe:

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie implementiert man UnmarshalJSON für abgeleitete Skalartypen in Go?. 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