Maison >développement back-end >Golang >Comment contrôler dynamiquement les champs de réponse JSON dans Go ?

Comment contrôler dynamiquement les champs de réponse JSON dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 00:30:10647parcourir

How to Dynamically Control JSON Response Fields in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn