Maison > développement back-end > Golang > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-26 18:41:16
original
389 Les gens l'ont consulté

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
}
Copier après la connexion

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())
        }
    }
}
Copier après la connexion

Sortie :

Hello Ralph
Hello Ralph
Hello Ralph
Hello Ralph
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal