Maison >développement back-end >Golang >Comment contrôler dynamiquement les champs de réponse JSON dans Go ?
Suppression ou masquage dynamique de champs dans les réponses JSON
Lorsque vous travaillez avec des réponses API, il est souvent utile de contrôler les champs spécifiques qui sont renvoyés à l'appelant. Dans Go, les structures sont couramment utilisées pour représenter les données codées en JSON. Cependant, les balises struct définies statiquement peuvent ne pas offrir suffisamment de flexibilité pour supprimer ou masquer dynamiquement des champs spécifiques.
Suppression de champs d'une structure
Il n'est pas possible de supprimer dynamiquement des champs à partir d'une structure dans Go. Les champs déclarés dans une structure font partie intégrante de la définition du type.
Masquage des champs dans la réponse JSON
La balise omitempty JSON peut être utilisée pour masquer les champs vides dans une réponse JSON. Cependant, cette approche n'est pas adaptée aux situations où vous devez masquer des champs non vides.
Utiliser des cartes au lieu de Structs
Une façon de contrôler dynamiquement les champs inclus dans la réponse consiste à utiliser une map[string]interface{}. Les cartes sont des collections non ordonnées de paires clé-valeur. Vous pouvez supprimer des champs d'une carte à l'aide de la fonction intégrée de suppression.
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 }
Dans cet exemple, les champs à renvoyer sont spécifiés dans le paramètre GET des champs. Le code parcourt la carte, supprimant tous les champs qui ne sont pas inclus dans la liste spécifiée. Enfin, la carte modifiée est codée en JSON et renvoyée à l'appelant.
Approche alternative
Une autre alternative consiste à interroger la base de données uniquement pour les champs demandés. Cette approche nécessite de modifier la requête SQL pour inclure uniquement les champs souhaités. Bien que cette méthode soit plus efficace, elle n'est peut-être pas réalisable dans tous les cas.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!