SQL Server使用INNER JOIN时如何让Go结构体仅返回关联表名称字段
方案1(最推荐):新增接口响应DTO结构体
业务中通常会把数据库映射模型和接口返回模型分开,避免内部结构暴露,也方便灵活调整返回字段:
- 定义专门用于返回的DTO结构体:
type UserResponse struct { IdUser int64 `json:"id_user"` Name string `json:"name"` Surname string `json:"surname"` Email string `json:"email"` RoleName string `json:"role_name"` StateName string `json:"state_name"` }
- 修改查询逻辑,直接将结果扫描到DTO字段:
// 把原来的[]model.User改成[]UserResponse users := []UserResponse{} for rows.Next() { var u UserResponse if err := rows.Scan(&u.IdUser, &u.Name, &u.Surname, &u.Email, &u.RoleName, &u.StateName); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } users = append(users, u) }
这种方式没有冗余字段,返回的JSON就是你需要的平级结构,也不会出现多余的0001-01-01零值时间。
方案2:修改原有User结构体
如果你不想新增结构体,可以调整原有model.User的字段标签:
- 给嵌套的关联结构体字段加
json:"-"忽略序列化,新增两个平级的name字段:
type User struct { Id_User int64 `json:"id_user,omitempty"` Name string `json:"name,omitempty"` Surname string `json:"surname,omitempty"` Email string `json:"email,omitempty"` // 忽略嵌套结构体的序列化 Id_RoleUser UserRole `json:"-"` Id_UserState UserState `json:"-"` // 新增平级返回字段 RoleName string `json:"role_name,omitempty"` StateName string `json:"state_name,omitempty"` // 不需要返回的字段也可以加json:"-"忽略,避免返回零值时间 NameSecond string `json:"-"` SurnameSecond string `json:"-"` Password string `json:"-"` CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` // 注意你原tag写错了,把updated_at写成了crated_at }
- 修改扫描逻辑,直接赋值给新增的平级字段:
rows.Scan(&user.Id_User, &user.Name, &user.Surname, &user.Email, &user.RoleName, &user.StateName)
方案3:自定义嵌套结构体的序列化规则
如果要保留原有结构体结构,也可以给UserRole和UserState实现MarshalJSON方法,序列化时直接返回name值:
func (ur UserRole) MarshalJSON() ([]byte, error) { return json.Marshal(ur.Name) } func (us UserState) MarshalJSON() ([]byte, error) { return json.Marshal(us.Name) }
同时调整User结构体中这两个字段的json标签:
type User struct { // ... 其他字段不变 Id_RoleUser UserRole `json:"role_name,omitempty"` Id_UserState UserState `json:"state_name,omitempty"` // ... 其他字段不变 }
注意:该方案会影响所有使用这两个结构体的序列化场景,如果其他接口需要返回完整的UserRole/UserState结构则不适用。
另外你当前返回结果里的0001-01-01T00:00:00Z是因为time.Time是值类型,零值不是nil,omitempty标签不会自动忽略,不需要返回的字段直接加json:"-"忽略即可。
内容的提问来源于stack exchange,提问作者cosmos multi
相关产品推荐
相关产品推荐

