Golang结构体Error字段JSON返回为空,控制台可打印错误信息
问题解决:Gin中自定义结构体的error字段JSON序列化为空对象
问题原因
Go的encoding/json包序列化接口类型时,只会处理其底层类型的可导出字段。而标准库中errors.New()返回的错误(如*errors.errorString)是包含非导出字段的结构体,序列化后自然呈现为空对象{}。
解决方案1:将Error字段类型改为string
直接把结构体里的Error字段从error换成string,赋值时传入错误的字符串表示即可:
修改结构体定义:
type RequestResponse struct { Status int `json:"status"` Data interface{} `json:"data"` Error string `json:"error"` // 替换为string类型 Pagination Pagination `json:"pagination"` }
在服务方法中赋值错误时,调用err.Error()转换为字符串:
// 示例服务方法逻辑 func GetTickerBySymbol(symbol string) RequestResponse { // 业务逻辑... if err != nil { return RequestResponse{ Error: err.Error(), // 其他字段按需设置 } } // 正常返回数据... }
解决方案2:自定义JSON序列化方法
如果不想修改字段类型,可以给RequestResponse实现json.Marshaler接口,手动处理Error字段的序列化:
type RequestResponse struct { Status int `json:"status"` Data interface{} `json:"data"` Error error `json:"error"` Pagination Pagination `json:"pagination"` } // 自定义MarshalJSON方法,将error转为字符串 func (r RequestResponse) MarshalJSON() ([]byte, error) { // 定义别名避免递归序列化 type Alias RequestResponse return json.Marshal(&struct { Alias Error string `json:"error"` }{ Alias: Alias(r), Error: func() string { if r.Error != nil { return r.Error.Error() } return "" }(), }) }
修改后,错误响应会变为:
{"status":400,"data":null,"error":"record not found","pagination":{"page":0,"totalPages":0,"totalElements":0}}
内容的提问来源于stack exchange,提问作者BitQueen
相关产品推荐
相关产品推荐

