Extension de structures inconnues avec des champs JSON arbitraires
Dans Go, l'ajout de champs supplémentaires à une représentation JSON d'une structure connue peut être réalisé à l'aide d'un structure anonyme. Cependant, cette approche n’est pas applicable lorsqu’il s’agit de structures inconnues. Cet article explique comment obtenir des fonctionnalités similaires dans de tels scénarios.
Package Reflect pour la génération de types dynamiques
Une solution consiste à utiliser le package Reflect pour générer dynamiquement une structure personnalisée. tapez au moment de l’exécution. Ce type comprend un champ anonyme du même type que l'interface encapsulée et un champ "Extra" supplémentaire. Cela permet la promotion des champs de la structure intégrée, permettant une représentation JSON appropriée.
func printInterface(val interface{}) { // Define the new struct type dynamically t2 := reflect.StructOf([]reflect.StructField{ { Name: "X", Anonymous: true, Type: reflect.TypeOf(val), }, { Name: "Extra", Type: reflect.TypeOf(""), }, }) // Create a new instance of the dynamic type v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") // Encode the dynamic type's value to JSON json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Double marshalling pour les champs JSON arbitraires
Une approche alternative consiste à sérialiser l'interface, analyser le JSON résultant dans une carte, ajouter le champ "Extra", puis resérialiser la carte modifiée en JSON. Cette méthode est plus simple mais peut entraîner une pénalité de performances en raison de plusieurs étapes de sérialisation.
func printInterface(val interface{}) error { // Serialize the interface to JSON data, err := json.Marshal(val) if err != nil { return err } // Unmarshal the JSON into a map v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } // Add the "Extra" field to the map v2["Extra"] = "text" // Serialize the modified map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Les deux méthodes étendent efficacement les structures inconnues avec le champ « Extra » souhaité dans la représentation JSON, répondant aux scénarios où la manipulation directe des structures n'est pas réalisable.
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!