1. ホーム

[解決済み】構造体からフィールドを削除したり、JSONレスポンスでフィールドを隠したりする方法

2022-04-04 06:06:08

質問

GoでAPIを作成しました。呼び出されると、クエリを実行し、構造体のインスタンスを作成し、その構造体をJSONとしてエンコードしてから呼び出し元に送り返します。 呼び出し元が、GET パラメータに "fields" を渡すことによって、返したい特定のフィールドを選択できるようにしたいと思います。

つまり、fieldsの値によって、私の構造体が変化することになります。 構造体からフィールドを削除する方法はありますか? または、少なくともJSON応答で動的に隠す方法はありますか? 注:時々、空の値があるので、JSON omitEmptyタグはここでは機能しません)どちらも不可能な場合、これを処理する良い方法について提案はありますか?

私が使っている構造体の縮小版は以下の通りです。

type SearchResult struct {
    Date        string      `json:"date"`
    IdCompany   int         `json:"idCompany"`
    Company     string      `json:"company"`
    IdIndustry  interface{} `json:"idIndustry"`
    Industry    string      `json:"industry"`
    IdContinent interface{} `json:"idContinent"`
    Continent   string      `json:"continent"`
    IdCountry   interface{} `json:"idCountry"`
    Country     string      `json:"country"`
    IdState     interface{} `json:"idState"`
    State       string      `json:"state"`
    IdCity      interface{} `json:"idCity"`
    City        string      `json:"city"`
} //SearchResult

type SearchResults struct {
    NumberResults int            `json:"numberResults"`
    Results       []SearchResult `json:"results"`
} //type SearchResults

そして、このようなレスポンスをエンコードして出力しています。

err := json.NewEncoder(c.ResponseWriter).Encode(&msg)

解決方法は?

この質問では、フィールドを 動的に は、呼び出し元が提供するフィールドのリストに基づいて選択されます。これは、静的に定義されたjson構造体タグでは不可能です。

もし、あなたが欲しいものが 常に フィールドをスキップして json-encode する場合は、当然ながら json:"-" を使用すると、そのフィールドを無視することができます。(なお、これは ではなく これらのフィールドは、json エンコーダーによって常に無視されます)。これは質問の内容とは異なります。

のコメントを引用すると json:"-" の答えになります。

これ【は json:"-" 回答]は、検索してここにたどり着いた人の多くが望む答えですが、質問の答えにはなっていません。

私なら map[string]interface{} この場合、構造体の代わりに を呼び出すと、簡単にフィールドを削除できます。 delete を、削除するフィールドのマップに組み込みました。

つまり、そもそも要求されたフィールドのみを問い合わせることができない場合です。