Maison  >  Article  >  développement back-end  >  Comment regrouper les clés JSON dynamiques dans des champs Struct dans Go ?

Comment regrouper les clés JSON dynamiques dans des champs Struct dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-19 01:26:02879parcourir

How to Unmarshal Dynamic JSON Keys into Struct Fields in Go?

Désorganisation des clés JSON dynamiques dans des champs de structure dans Go

Les clés JSON dynamiques peuvent poser un défi lors de la désorganisation en structures avec des noms de champs statiques. Considérez le fichier de configuration JSON suivant :

{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}

Pour représenter ce JSON dans une structure Go, vous pouvez utiliser une carte au lieu de noms de champs statiques :

type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}

Ensuite, désorganisez le JSON en utilisant la fonction json.Unmarshal :

var x X
if err := json.Unmarshal(data, &x); err != nil {
    // handle error
}

Avec cette approche, les clés dynamiques deviennent les clés de la carte, vous permettant d'accéder les valeurs selon vos besoins.

Cependant, si la clé doit être membre de la structure Thing, vous pouvez écrire une boucle pour ajouter la clé après le démarshalling :

type Thing struct {
    Name string `json:"-"` // add the field
    Key1 string
    Key2 string
}

...

// Fix the name field after unmarshal
for k, t := range x.Things {
    t.Name = k
    x.Things[k] = t
}

Cette méthode vous permet avoir à la fois la clé comme champ et les valeurs dynamiques.

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