Felder in JSON-Antworten dynamisch entfernen oder ausblenden
Bei der Arbeit mit API-Antworten ist es oft nützlich, die spezifischen Felder zu steuern, an die zurückgegeben wird der Anrufer. In Go werden Strukturen häufig zur Darstellung von Daten verwendet, die in JSON codiert sind. Allerdings bieten statisch definierte Struktur-Tags möglicherweise nicht genügend Flexibilität, um bestimmte Felder dynamisch zu entfernen oder auszublenden.
Felder aus einer Struktur entfernen
Es ist nicht möglich, Felder dynamisch zu entfernen aus einer Struktur in Go. Felder, die in einer Struktur deklariert sind, sind dauerhaft Teil der Typdefinition.
Ausblenden von Feldern in der JSON-Antwort
Mit dem JSON-Tag omitempty können leere Felder ausgeblendet werden eine JSON-Antwort. Dieser Ansatz eignet sich jedoch nicht für Situationen, in denen Sie nicht leere Felder ausblenden müssen.
Verwendung von Karten anstelle von Strukturen
Eine Möglichkeit, die enthaltenen Felder dynamisch zu steuern in der Antwort soll ein Map[string]interface{} verwendet werden. Karten sind ungeordnete Sammlungen von Schlüssel-Wert-Paaren. Sie können Felder mit der integrierten Funktion „Löschen“ aus einer Karte entfernen.
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 }
In diesem Beispiel werden die zurückzugebenden Felder im GET-Parameter „fields“ angegeben. Der Code durchläuft die Karte und entfernt alle Felder, die nicht in der angegebenen Liste enthalten sind. Abschließend wird die geänderte Karte als JSON codiert und an den Aufrufer zurückgegeben.
Alternativer Ansatz
Eine andere Alternative besteht darin, die Datenbank nur nach den angeforderten Feldern abzufragen. Bei diesem Ansatz muss die SQL-Abfrage so geändert werden, dass sie nur die gewünschten Felder enthält. Obwohl diese Methode effizienter ist, ist sie möglicherweise nicht in allen Fällen durchführbar.
Das obige ist der detaillierte Inhalt vonWie steuere ich JSON-Antwortfelder in Go dynamisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!