Unmarshalling JSON avec des structures récursives
Considérez la chaîne JSON suivante représentant une configuration pour MongoDB :
[{ "db": { "url": "mongodb://localhost", "port": "27000", "uname": "", "pass": "", "authdb": "", "replicas": [ { "rs01": { "url":"mongodb://localhost", "port": "27001", "uname": "", "pass": "", "authdb": "" } }, { "rs02": { "url":"mongodb://localhost", "port": "27002", "uname": "", "pass": "", "authdb": "" } } ] } }]
Nous avoir une structure, DBS, qui modélise le JSON :
type DBS struct { URL string `json:url` Port string `json:port` Uname string `json:uname` Pass string `json:pass` Authdb string `json:authdb` Replicas []DBS `json:replicas` }
Cependant, nous rencontrons un problème lors de la désorganisation du JSON à l'aide de json.Unmarshal. Après le processus, notre tranche DBS reste vide.
Le problème sous-jacent est que notre entrée JSON a un objet JSON supplémentaire enveloppant nos valeurs DBS, et nos valeurs DBS sont des propriétés de l'objet "db". De plus, le tableau "replicas" contient des objets avec différentes clés qui peuvent être représentées par DBS.
Pour modéliser avec précision ce JSON, nous avons besoin d'un type "dynamique". Une carte constitue une option appropriée. Par conséquent, la structure appropriée pour notre JSON est []map[string]DBS.
type DBS struct { URL string `json:"url"` Port string `json:"port"` Uname string `json:"uname"` Pass string `json:"pass"` Authdb string `json:"authdb"` Replicas []map[string]DBS `json:"replicas"` }
Cette structure alternative analyse efficacement l'entrée JSON :
// ... if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } fmt.Printf("%+v", dbs)
La sortie représente la structure JSON avec précision.
De plus, nous pouvons optimiser le modèle en utilisant des pointeurs et en modélisant le premier niveau, qui est toujours "db":
type DBReplicated struct { DB *DBS `json:"db"` } type DBS struct { URL string `json:"url"` Port string `json:"port"` Uname string `json:"uname"` Pass string `json:"pass"` Authdb string `json:"authdb"` Replicas []map[string]*DBS `json:"replicas"` }
Ce modèle mis à jour fournit une représentation plus concise et efficace de la configuration JSON.
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!