Golang エラータイプは JSON にエンコードされると空になります 質問する

Golang エラータイプは JSON にエンコードされると空になります 質問する

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()価値を創造するerrorerrors.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 errorErrorMsgフィールドは保持したくない場合)、カスタムマーシャリングロジックを実装する必要があります。json.Marshalererror値を意味のある値string(または適切にマーシャリングできる別の値) に「変換」できるインターフェイスです。

おすすめ記事