error
タイプは、単一Error()
方法とのインタフェースであり、それはjson
パッケージ(Error()
メソッドがその上に呼び出されていない)に特別ではありません。
ただし、error
の値には、整列可能な静的型の値が格納されている場合があり、json.Marshaler
を実装することによって独自の整列ロジックを定義できます。単にerror
をError()
メソッドを呼び出すことによってstring
に変換するということは、カスタムマーシャリングロジックを尊重していないことを意味します。
だから私たちはあるべき私たちのマーシャリング・ロジックを実装することができた上で、私たち自身のエラースライスタイプを作成することをお勧め:
- チェックエラー値は、
json.Marshaler
を実装し、もしそうなら、それは自分自身を整列させた場合簡単にマーシャリングすることができますstring
「を得る」ためのフォールバックケース呼び出しerror.Error()
など他
これはそれのように見える可能性がどのようにされています
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>
我々はまた、カスタムマーシャリング・ロジックを実装するカスタム・エラー・タイプを使用しています