Aperçu du problème
L'ajout de champs arbitraires à la sortie JSON peut être réalisé en étendant un structure connue de manière anonyme. Cependant, cette approche est limitée lorsqu’il s’agit de structures ou d’interfaces inconnues. Cet article explore les solutions à ce défi.
Solution 1 : génération de type dynamique à l'aide de Reflection
Une solution consiste à générer un type dynamique au moment de l'exécution à l'aide du package Reflect. Ce nouveau type est une structure avec un champ anonyme du type d'interface encapsulé et un champ supplémentaire pour la valeur supplémentaire. En réfléchissant à la valeur et en définissant les champs en conséquence, nous pouvons obtenir la sortie JSON souhaitée.
func printInterface(val interface{}) { // Create a new struct type with anonymous field for the interface t2 := reflect.StructOf([]reflect.StructField{ {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)}, {Name: "Extra", Type: reflect.TypeOf("")}, }) // Create a new value of the dynamic type v2 := reflect.New(t2).Elem() // Set the value of the anonymous field to the input interface v2.Field(0).Set(reflect.ValueOf(val)) // Set the extra field to the desired value v2.FieldByName("Extra").SetString("text") json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Solution 2 : Marshaling et Unmarshaling
Alternativement, nous pouvons rassembler la valeur en JSON, la décomposer dans une carte, ajouter le champ supplémentaire et rassembler le résultat encore une fois.
func printInterface(val interface{}) error { // Marshal the value 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 v2["Extra"] = "text" // Marshal the map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Comparaison des solutions
La solution basée sur la réflexion génère un nouveau type spécifiquement pour l'interface donnée, ce qui donne lieu à une approche plus adaptée et potentiellement plus rapide. . La solution de marshaling et de démarshaling est plus simple mais plus lente en raison de l’étape de marshaling supplémentaire. L'ordre des champs dans la sortie JSON peut également différer dans cette dernière approche.
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!