REST API 用に JSON をエンコードしようとしていますが、いくつかのエラーを除いてすべて正常に動作しています。たとえば、次の構造体の場合:
type TemplateResponse struct {
Message string
Error error
Template Template
}
このデータでエンコードされます:
res := TemplateResponse{"Template not found.", fmt.Errorf("There is no template on this host with the name " + vars["name"]), Template{}}
json.NewEncoder(w).Encode(res)
戻り値:
{
"Message": "Template not found.",
"Error": {},
"Template": {
"Name": "",
"Disabled": false,
"Path": "",
"Version": ""
}
}
アプリケーション全体で、どうやらランダムにこのエラーが発生しており、「エラー」タイプが空として返されています。何かアイデアはありますか?
ありがとう!
ベストアンサー1
なぜならerror
は単なるインターフェースです。それを実装する任意の具体的な型の値を保持できます。
あなたの例ではfmt.Errorf()
価値を創造するerror
。errors.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
error
値を意味のある値string
(または適切にマーシャリングできる別の値) に「変換」できるインターフェイスです。