Maison > développement back-end > Golang > Comment gérer les types intégrés et le marshaling JSON avec MongoDB dans Go ?

Comment gérer les types intégrés et le marshaling JSON avec MongoDB dans Go ?

Susan Sarandon
Libérer: 2024-11-08 19:42:02
original
507 Les gens l'ont consulté

How to Handle Embedded Types and JSON Marshaling with MongoDB in Go?

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"`
}
Copier après la connexion

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"`
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal