Maison > développement back-end > Golang > Comment désorganiser le JSON dynamique avec une clé de type intégrée dans Go ?

Comment désorganiser le JSON dynamique avec une clé de type intégrée dans Go ?

Susan Sarandon
Libérer: 2024-12-08 01:48:16
original
544 Les gens l'ont consulté

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

Désagrégation du JSON dynamique avec une clé de type intégrée

Dans Go, la désorganisation des données JSON dans une structure avec un champ de type dynamique peut être stimulant. Cet article explore une solution qui exploite des structures personnalisées et une clé de type intégrée pour y parvenir.

Énoncé du problème

Considérez la structure JSON suivante :

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
Copier après la connexion

Nous voulons désorganiser ce JSON dans une structure Go qui a un champ DynamicField d'un type d'interface Something. En fonction de la valeur de la clé de type dans le JSON, DynamicField doit correspondre soit à DynamicTypeA, soit à DynamicTypeB.

Solution

Pour résoudre ce problème, nous définissons la personnalisation suivante structs :

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}
Copier après la connexion

DynamicType représente le champ dynamique, avec la clé Type intégrée pour déterminer le type réel du données. Le champ Value n'est pas exporté pour empêcher l'accès direct.

Ensuite, nous définissons la structure Go pour représenter le JSON :

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}
Copier après la connexion

Enfin, nous implémentons la méthode UnmarshalJSON pour DynamicType :

func (d *DynamicType) UnmarshalJSON(data []byte) error {
  var typ struct {
    Type string `json:"type"`
  }
  if err := json.Unmarshal(data, &typ); err != nil {
    return err
  }
  switch typ.Type {
  case "A":
    d.Value = new(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}
Copier après la connexion

Cette méthode désorganise la clé de type puis crée une structure appropriée (DynamicTypeA ou DynamicTypeB) en fonction de la valeur. Il désorganise ensuite les données JSON restantes dans la structure créée, qui est ensuite stockée dans le champ Valeur.

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