構造体からフィールドを削除するか、JSON レスポンスでフィールドを非表示にする 質問する

構造体からフィールドを削除するか、JSON レスポンスでフィールドを非表示にする 質問する

私は 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削除するフィールドのマップ上で組み込みを呼び出すことで、フィールドを簡単に削除できます。

つまり、そもそも要求されたフィールドのみをクエリできない場合です。

おすすめ記事