Types intégrés et marshaling JSON dans Go avec MongoDB
Dans MongoDB, les types intégrés sont un moyen courant de représenter des structures de données hiérarchiques. Cependant, lorsque vous utilisez l'encodeur JSON de Go avec des types intégrés, il est important de considérer la façon dont les champs omis sont gérés.
Supposons que vous ayez une structure User avec un champ Secret annoté avec json:"-" pour l'exclure du JSON standard. réponses. Pour renvoyer le champ secret aux utilisateurs administrateurs, vous pourriez être tenté de créer une structure adminUser distincte avec un champ Secret en double. Cependant, cette approche duplique le code et peut entraîner des problèmes de maintenance.
Envisagez plutôt d'utiliser la balise bson:",inline" pour le champ Utilisateur dans adminUser. Cela demande à l'encodeur JSON d'incorporer les champs de la structure intégrée, les combinant ainsi en un seul objet JSON.
type adminUser struct { User `bson:",inline"` Secret string `json:"secret,omitempty" bson:"secret,omitempty"` }
Cependant, cette approche peut introduire des erreurs de clé en double lors de la lecture à partir de MongoDB, car à la fois adminUser et L'utilisateur contient le champ Secret. Pour résoudre ce problème, supprimez le champ Secret de l'utilisateur et placez-le uniquement dans adminUser.
type User struct { Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` } type adminUser struct { User `bson:",inline"` Secret string `json:"secret,omitempty" bson:"secret,omitempty"` }
Désormais, lors de la récupération d'un utilisateur avec un utilisateur administrateur, le champ secret sera inclus dans la réponse JSON.
func getUser(w http.ResponseWriter, r *http.Request) { ....omitted code... var user adminUser err := common.GetDB(r).C("users").Find( bson.M{"_id": userId}, ).One(&user) if err != nil { return } common.ServeJSON(w, &user) }
Cette approche préserve la source unique de vérité pour la structure User et vous permet d'inclure ou d'exclure dynamiquement le champ secret en fonction des autorisations de l'utilisateur.
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!