Comprendre comment désorganiser JSON dans une interface{} est une compétence cruciale pour les développeurs Go. Dans cet article, nous passerons en revue un exemple pratique qui met en évidence les pièges et les solutions associés au démarshaling de JSON dans une structure avec un champ interface{}.
Considérez les définitions de types suivantes :
type Message struct { Cmd string `json:"cmd"` Data interface{} `json:"data"` } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Étant donné une chaîne JSON représentant un message de création, nous pourrions tenter de le décoder en un message struct :
{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
import "encoding/json" var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`) var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) }
En examinant la structure Message non marshalée, nous remarquons que le champ Données reste sous la forme d'une map[string]interface{} :
{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
Pour surmonter cette limitation, nous employons une approche à deux volets approche :
type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Avec ces modifications, nous pouvons décoder les données variantes dans le type de structure approprié en fonction de la commande :
func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }
En employant cette technique, nous pouvons réussissez à désassembler les données JSON dans la structure Message, où le champ Données contient la variante du type CreateMessage. Reportez-vous à l'exemple de terrain de jeu fourni pour une implémentation complète.
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!