You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:20