英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论