Go:JSON Marshaling一个错误

时间:2015-02-19 00:05:41

标签: go marshalling

我正在Go中构建一个JSON API,我想以json的形式返回错误响应。

回复示例:

{
    "error": "Invalid request syntax"
}

我认为我可以创建一个实现错误接口的包装结构,然后使用Go的json marshaler作为一种干净的方式来获取错误的json表示:

type JsonErr struct {
    Err error `json:"error"`
}
func (t JsonErr) Error() string {
    return t.Err.Error()
}

这只会将JsonErr编组为{"error":{}},有没有办法使用默认的Go json编组程序来编码这个结构,或者我是否需要为JsonErr结构编写快速自定义MarshalJson?

1 个答案:

答案 0 :(得分:5)

只需实施json.Marshaler界面:

func main() {
    var err error = JsonErr{errors.New("expected")}
    json.NewEncoder(os.Stdout).Encode(err)
}

type JsonErr struct {
    error
}

func (t JsonErr) MarshalJSON() ([]byte, error) {
    return []byte(`{"error": "` + t.Error() + `"}`), nil
}

它不起作用的原因是因为json.Marshal没有检测到错误接口,并且大多数错误类型没有导出字段,因此反射不能显示这些字段。