Maison >développement back-end >Golang >Comment puis-je gérer le démarshaling JSON avec des types de données variables (objets ou chaînes) dans Go ?

Comment puis-je gérer le démarshaling JSON avec des types de données variables (objets ou chaînes) dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 00:51:15226parcourir

How Can I Handle JSON Unmarshaling with Variable Data Types (Objects or Strings) in Go?

Gestion du démarshaling JSON avec des tableaux d'objets ou des chaînes dans Go

Lors du démarshaling JSON en structures dans Go, vous pouvez rencontrer des champs qui peuvent contenir différents types (objets ou chaînes) d’une requête à l’autre. Par exemple, un champ nommé "mykey" peut parfois contenir des objets en ligne et d'autres fois contenir des références à des objets situés sur des chemins spécifiques.

Solution Go-Idiomatic

Un Go idiomatique L'approche pour gérer cette situation consiste à définir une structure avec un champ dont le type est une tranche de valeurs d'interface {}. Cela permet au champ de contenir à la fois des objets et des chaînes, car Go les décodera automatiquement dans le type approprié en fonction du JSON entrant. Le code suivant le démontre :

type Data struct {
    MyKey []interface{} `json:"mykey"`
}

Vérification de type

Après avoir désorganisé le JSON, vous pouvez utiliser un commutateur de type pour faire la distinction entre les objets et les chaînes dans la tranche :

for i, v := range data.MyKey {
    switch x := v.(type) {
    case string:
        fmt.Println("Got a string: ", x)
    case map[string]interface{}:
        fmt.Printf("Got an object: %#v\n", x)
    }
}

Cela vous permet de gérer les deux types de valeurs de manière structurée et efficace manière.

Exemple

Considérez le JSON suivant :

{
  "mykey": [
    {obj1}, 
    {obj2}
  ]
}

Après avoir désorganisé ce JSON dans une structure Data, la tranche MyKey contiendra deux éléments, chacun de type map[string]interface{}.

Alternativement, si le JSON contenait des références aux objets :

{
  "mykey": [
    "/obj1/is/at/this/path", 
    "/obj2/is/at/this/other/path"
  ]
}

La tranche MyKey contiendra deux éléments, chacun de type chaîne.

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