Go で MongoDB を使用して埋め込み型と JSON マーシャリングを処理する方法は?

Susan Sarandon
リリース: 2024-11-08 19:42:02
オリジナル
477 人が閲覧しました

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

MongoDB を使用した Go での埋め込み型と JSON マーシャリング

MongoDB では、埋め込み型は階層データ構造を表す一般的な方法です。ただし、埋め込み型で Go の JSON エンコーダを使用する場合、省略されたフィールドがどのように処理されるかを考慮することが重要です。

通常の JSON から除外するために、json:"-" の注釈が付けられた Secret フィールドを持つ User 構造体があるとします。応答。管理者ユーザーの Secret フィールドを返すには、重複した Secret フィールドを持つ別の adminUser 構造体を作成したくなるかもしれません。ただし、この方法ではコードが重複するため、メンテナンスの問題が発生する可能性があります。

代わりに、adminUser の User フィールドに bson:",inline" タグを使用することを検討してください。これにより、埋め込み構造体のフィールドをインライン化し、それらを単一の JSON オブジェクトに効果的に結合するように JSON エンコーダーに指示します。

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
ログイン後にコピー

ただし、このアプローチでは、adminUser と adminUser の両方として MongoDB から読み取るときに重複キー エラーが発生する可能性があります。ユーザーには Secret フィールドが含まれます。これを解決するには、User から Secret フィールドを削除し、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"`
}
ログイン後にコピー

これで、管理者ユーザーでユーザーを取得するときに、JSON 応答に Secret フィールドが含まれるようになります。

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)
}
ログイン後にコピー

このアプローチでは、User 構造体の信頼できる唯一の情報源が保持され、ユーザーの権限に基づいて Secret フィールドを動的に含めたり除外したりできます。

以上がGo で MongoDB を使用して埋め込み型と JSON マーシャリングを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート