Go: JSON Marshaling an error

huangapple go评论82阅读模式
英文:

Go: JSON Marshaling an error

问题

我正在使用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 marshaler来编码此结构体的方法,或者我需要为JsonErr结构体编写一个快速自定义MarshalJson函数?

英文:

I'm building a JSON API in Go and I'd like to return error responses as json.

Example response:

{
    "error": "Invalid request syntax"
}

I thought that I could create a wrapper struct that implements the error interface, and then use Go's json marshaler as a clean way to get the json representation of the error:

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

This will just marshal a JsonErr as {"error":{}}, is there a way of using the default Go json marshaler to encode this struct, or do I need to write a quick custom MarshalJson for JsonErr structs?

答案1

得分: 6

只需实现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没有检测错误接口,并且大多数错误类型没有导出的字段,因此反射无法显示这些字段。

英文:

Just implement the json.Marshaler interface:

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
}

The reason it doesn't work is because json.Marshal has no detection for the error interface and most error types have no exported fields so reflection can't display those fields.

huangapple
  • 本文由 发表于 2015年2月19日 08:05:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/28596376.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定