Because error https://golang.org/pkg/builtin/#error只是一个接口。它可以保存实现它的任何具体类型的值。
在你的例子中你使用了fmt.Errorf() https://golang.org/pkg/fmt/#Errorf创建一个error
价值。这叫errors.New() https://golang.org/pkg/errors/#example_New它返回一个指向未导出的值的指针errors.errorString
结构。它的定义是:
type errorString struct {
s string
}
该结构值将被封送,但由于它没有导出字段(仅封送导出字段),因此它将是一个空的 JSON 对象:{}
.
“修复”是:不要封送“通用”接口的值,依赖于动态值可以有意义地封送为 JSON。相反,您应该添加一个存储错误字符串的字段(error.Error()
),并省略Error error
编组字段,例如:
type TemplateResponse struct {
Message string
Error error `json:"-"`
ErrorMsg string
Template Template
}
当然你还需要设置/填充ErrorMsg
编组前的字段。
或者如果您不需要存储error
结构中的值,完全删除该字段:
type TemplateResponse struct {
Message string
ErrorMsg string
Template Template
}
如果您还想保留Error error
字段(而不是ErrorMsg
字段),那么您需要通过实现来实现自定义封送逻辑json.Marshaler https://golang.org/pkg/encoding/json/#Marshaler您可以在其中“转换”界面error
价值到有意义的string
例如(或转换为可以正确整理的另一个值)。