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 サイトの他の関連記事を参照してください。