我正在Go中构建一个JSON API,我想将错误响应作为json返回。
响应示例:
{ "error": "Invalid request syntax" }
我以为我可以创建一个实现错误接口的包装器结构,然后使用Go的json封送处理程序作为获取错误的json表示形式的一种干净方法:
type JsonErr struct { Err error `json:"error"` } func (t JsonErr) Error() string { return t.Err.Error() }
这只会将JsonErr {"error":{}}封送为,是否可以使用默认的Go json封送处理程序对该结构进行编码,还是需要为JsonErr结构编写快速的自定义MarshalJson?
{"error":{}}
只需实现json.Marshaler接口:
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没有检测到错误接口,并且大多数错误类型都没有导出的字段,因此反射无法显示这些字段。
json.Marshal