2017-07-08 4 views
4

REST APIのためにJSONをエンコードしようとしていますが、いくつかのエラーを除いてすべて正常に動作しています。例えば、この構造体を持つ:JSONにエンコードするとGolangのエラータイプが空になる

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": "" 
    } 
} 

私は自分のアプリケーション間で、一見ランダムにこれを取得しています、 'エラー'型は空として返されます。何か案は?

ありがとうございます!

答えて

7

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値を格納する必要がない場合は、完全にそのフィールド削除:あなたはまだError errorフィールド(およびないErrorMsgフィールド)を維持したい場合は、その後、

type TemplateResponse struct { 
    Message string 
    ErrorMsg string 
    Template Template 
} 

をたとえば、インターフェイスを実装して、errorの値を意味のあるstring(または適切にマーシャリングできる別の値)に「変換」できるカスタムマーシャリングロジックを実装する必要があります。

+0

理にかなっています。大きな説明に感謝します。 – putitonmytab

関連する問題