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
Susan Sarandonoriginal
2024-12-08 01:48:16618parcourir

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"
}

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
}

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"`
}

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

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!

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