Heim >Backend-Entwicklung >Golang >Wie implementiert man UnmarshalJSON für abgeleitete Skalartypen in Go?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 18:41:16467Durchsuche

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
}

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())
        }
    }
}

Ausgabe:

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph

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!

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