执行:JSON 编组错误
Go: JSON Marshaling an error
我正在 Go 中构建 JSON API,我想 return 错误响应 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结构?
只需实现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
没有检测到错误接口,并且大多数错误类型没有导出字段,因此反射无法显示这些字段。
我正在 Go 中构建 JSON API,我想 return 错误响应 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结构?
只需实现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
没有检测到错误接口,并且大多数错误类型没有导出字段,因此反射无法显示这些字段。