私は Go で API を作成しました。この API は、呼び出されるとクエリを実行し、構造体のインスタンスを作成し、その構造体を JSON としてエンコードしてから呼び出し元に返します。ここで、呼び出し元が "fields" GET パラメータを渡すことで、返される特定のフィールドを選択できるようにしたいと思います。
つまり、フィールド値に応じて、構造体が変わります。構造体からフィールドを削除する方法はありますか? または、少なくとも 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)
ベストアンサー1
質問は、呼び出し元が提供するフィールドのリストに基づいてフィールドを動的に選択することを要求しています。これは、静的に定義された json 構造体タグでは実行できません。
常にフィールドをスキップして json エンコードしたい場合は、もちろん を使用してjson:"-"
フィールドを無視します。(フィールドがエクスポートされていない場合は、これは必須ではないことにも注意してください。これらのフィールドは、json エンコーダーによって常に無視されます。) これは、質問の目的ではありません。
回答に対するコメントを引用しますjson:"-"
:
これは(
json:"-"
答えは)検索してここにたどり着いたほとんどの人が望む答えですが、質問に対する答えではありません。
map[string]interface{}
この場合、構造体の代わりにを使用します。delete
削除するフィールドのマップ上で組み込みを呼び出すことで、フィールドを簡単に削除できます。
つまり、そもそも要求されたフィールドのみをクエリできない場合です。