GET方法查询时Go+MongoDB如何拼接两个字段生成指定返回值
Go 结构体序列化JSON自动生成拼接name字段的实现方案
有两种常用的实现方式,你可以根据自己的业务场景选择:
方式1:自定义json.Marshaler接口实现(全局生效)
这种方式修改原结构体的序列化逻辑,所有对Employee类型执行JSON序列化的场景都会自动带上name字段,不需要额外的转换操作。
代码示例
import ( "encoding/json" "fmt" ) type Employee struct { LastName string `bson:"lastName" json:"lastName"` FirstName string `bson:"firstName" json:"firstName"` } // 实现json.Marshaler接口 func (e Employee) MarshalJSON() ([]byte, error) { // 定义别名避免序列化时递归调用MarshalJSON造成死循环 type EmpAlias Employee return json.Marshal(&struct { EmpAlias Name string `json:"name"` }{ EmpAlias: EmpAlias(e), Name: fmt.Sprintf("%s %s", e.LastName, e.FirstName), }) }
你直接把查询到的Employee实例返回给接口序列化框架即可,最终输出的JSON就会自动包含拼接好的name字段。
方式2:单独定义返回DTO(仅指定接口生效)
如果你不希望修改原结构体的全局序列化逻辑,仅在这个GET接口返回时才需要name字段,可以单独定义接口返回用的DTO结构体,查询到数据后做一次转换即可。
代码示例
// 原数据库模型不变 type Employee struct { LastName string `bson:"lastName"` FirstName string `bson:"firstName"` } // 接口返回专用DTO type EmployeeDTO struct { LastName string `json:"lastName"` FirstName string `json:"firstName"` Name string `json:"name"` } // 模型转换方法 func ToEmployeeDTO(emp Employee) EmployeeDTO { return EmployeeDTO{ LastName: emp.LastName, FirstName: emp.FirstName, Name: fmt.Sprintf("%s %s", emp.LastName, emp.FirstName), } } // 接口逻辑示例(以Gin框架为例) func GetEmployees(c *gin.Context) { // 从数据库查询到所有员工数据 var emps []Employee if err := mongo.Collection("employee").Find(nil, bson.M{}).All(&emps); err != nil { // 错误处理逻辑 c.JSON(500, gin.H{"msg": "查询失败"}) return } // 批量转换为DTO resp := make([]EmployeeDTO, 0, len(emps)) for _, emp := range emps { resp = append(resp, ToEmployeeDTO(emp)) } // 返回结果 c.JSON(200, resp) }
内容的提问来源于stack exchange,提问作者Clement Olaniyan
相关产品推荐
相关产品推荐

