ホームページ >バックエンド開発 >Golang >Go で JSON 応答フィールドを動的に制御する方法

Go で JSON 応答フィールドを動的に制御する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 00:30:10646ブラウズ

How to Dynamically Control JSON Response Fields in Go?

JSON 応答のフィールドを動的に削除または非表示にする

API 応答を操作する場合、返される特定のフィールドを制御すると便利なことがよくあります。電話をかけてきた人。 Go では、JSON にエンコードされたデータを表すために構造体がよく使用されます。ただし、静的に定義された構造体タグでは、特定のフィールドを動的に削除または非表示にするのに十分な柔軟性が提供されない場合があります。

構造体からのフィールドの削除

フィールドを動的に削除することはできません。 Go の構造体から。構造体で宣言されたフィールドは、永続的に型定義の一部です。

JSON 応答内のフィールドの非表示

JSON のomitempty タグを使用して、構造体の空のフィールドを非表示にできます。 JSON 応答。ただし、このアプローチは、空でないフィールドを非表示にする必要がある状況には適していません。

構造体の代わりにマップを使用する

含まれるフィールドを動的に制御する 1 つの方法レスポンスでは、map[string]interface{} を使用することになります。マップは、キーと値のペアの順序付けされていないコレクションです。 delete 組み込み関数を使用して、マップからフィールドを削除できます。

package main

import (
    "encoding/json"
    "fmt"
)

type SearchResults struct {
    NumberResults int                `json:"numberResults"`
    Results       []map[string]interface{} `json:"results"`
}

func main() {
    // Assume we obtained the following map from a query
    result := map[string]interface{}{
        "idCompany":   1,
        "company":     "Acme Inc.",
        "industry":    "Manufacturing",
        "idState":     5,
        "state":       "New York",
        "country":     "US",
        "otherField1": "Some Value 1",
        "otherField2": 2.3,
    }

    // Create a SearchResults struct
    searchResults := SearchResults{
        NumberResults: 1,
        Results:       []map[string]interface{}{result},
    }

    // Remove any fields not specified in the `fields` GET parameter
    fields := []string{"idCompany", "company", "state"}
    for k, v := range searchResults.Results {
        for f := range v {
            if !contains(fields, f) {
                delete(v, f)
            }
        }
    }

    // Encode the modified SearchResults as JSON
    jsonBytes, _ := json.Marshal(searchResults)

    // Print the JSON
    fmt.Println(string(jsonBytes))
}

func contains(s []string, e string) bool {
    for _, a := range s {
        if a == e {
            return true
        }
    }
    return false
}

この例では、返されるフィールドは、fields GET パラメーターで指定されています。コードはマップを反復処理して、指定されたリストに含まれていないフィールドを削除します。最後に、変更されたマップは JSON としてエンコードされ、呼び出し元に返されます。

代替アプローチ

もう 1 つの代替方法は、要求されたフィールドについてのみデータベースにクエリを実行することです。この方法では、必要なフィールドのみを含めるように SQL クエリを変更する必要があります。この方法はより効率的ですが、すべての場合に実行可能であるとは限りません。

以上がGo で JSON 応答フィールドを動的に制御する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。