gpt4 book ai didi

arrays - 如何在 Go 中将错误数组转换为 JSON

转载 作者:IT王子 更新时间:2023-10-29 00:43:36 24 4
gpt4 key购买 nike

我有一个错误数组(错误类型),但是当我尝试以 JSON 格式返回客户端时,它是空的。

它是这样创建的:

var (
ErrEmptyName = errors.New("Nome não pode ser vázio")
ErrInvalidType = errors.New("Tipo de pessoa inválido")
)

func (p Person) Validate() []error {

var errors []error

if govalidator.IsNull(p.Name) {
errors = append(errors, ErrEmptyName)
}

if p.Type != "F" && p.Type != "J" {
errors = append(errors, ErrInvalidType)
}

return errors
)

在我的 Controller 中:

err := person.Validate()
c.JSON(422, gin.H{"errors" : err})

我的输出:

{"errors":"[{}]"}

最佳答案

error type 是一个具有单个 Error() 方法的接口(interface),但它对 json 包来说并不特殊(Error() 方法不是调用它)。

但是,error 值可能包含可以很好地编码的静态类型的值,或者它们可以通过实现 json.Marshaler 来定义自己的编码逻辑。 .简单地通过调用其 Error() 方法将 error 转换为 string 意味着我们不遵守自定义编码(marshal)处理逻辑。

所以我建议创建我们自己的错误 slice 类型,我们可以在其上实现我们的编码逻辑,它应该是:

  • 检查错误值是否实现了json.Marshaler,如果是,让它自己编码
  • 否则作为后备案例调用 error.Error() 以“获取”可以轻松编码的 string

这是它的样子:

type JSONErrs []error

func (je JSONErrs) MarshalJSON() ([]byte, error) {
res := make([]interface{}, len(je))
for i, e := range je {
if _, ok := e.(json.Marshaler); ok {
res[i] = e // e knows how to marshal itself
} else {
res[i] = e.Error() // Fallback to the error string
}
}
return json.Marshal(res)
}

这就是你如何使用它:

err := person.Validate()
c.JSON(422, gin.H{"errors" : JSONErrs(err)})

让我们测试我们的JSONErrs。我们还使用了实现自定义编码逻辑的自定义错误类型:

type MyErr struct{ line int }

func (me MyErr) Error() string { return "Invalid input!" }

func (me MyErr) MarshalJSON() ([]byte, error) {
return json.Marshal(
struct {
Type, Error string
AtLine int
}{"MyErr", me.Error(), me.line})
}

和测试代码:

errs := []error{
errors.New("first"),
errors.New("second"),
MyErr{16},
}

data, err := json.Marshal(JSONErrs(errs))
fmt.Println(string(data), err)

输出(在 Go Playground 上尝试):

["first","second",{"Type":"MyErr","Error":"Invalid input!","AtLine":16}] <nil>

关于arrays - 如何在 Go 中将错误数组转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com