Maison >développement back-end >Golang >Comment implémenter UnmarshalJSON pour les types scalaires dérivés dans Go ?

Comment implémenter UnmarshalJSON pour les types scalaires dérivés dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 18:41:16462parcourir

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

Implémentation d'UnmarshalJSON pour les scalaires dérivés dans Go

Problème :
Un type personnalisé qui convertit les constantes entières sous-typées aux chaînes et vice versa nécessite une suppression automatique des chaînes JSON. C'est un défi car UnmarshalJSON ne fournit pas de moyen de modifier la valeur scalaire sans utiliser de structure.

Solution :
Pour implémenter UnmarshalJSON pour un type scalaire dérivé, envisagez les étapes suivantes :

Utilisez un récepteur pointeur :
Utilisez un récepteur de pointeur pour la méthode UnmarshalJSON pour modifier la valeur du récepteur.

Annuler le marshal en une chaîne :
Annuler le texte JSON dans une chaîne simple, en supprimant toutes les citations JSON.

Rechercher et définir la valeur :
Utilisez la fonction de recherche pour récupérer le PersonID correspondant en fonction de la valeur de la chaîne. Attribuez le résultat au récepteur.

Exemple :

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
}

Exemple de code :

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

Sortie :

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn