Problème :
Lorsque vous traitez des structures ou des interfaces inconnues, l'ajout de champs arbitraires à La sortie JSON peut être difficile. Le code démontré illustre ce problème. Comment pouvons-nous reproduire la sortie JSON souhaitée pour les structures inconnues ?
Solution 1 : génération de type dynamique à l'aide de la réflexion
Une approche consiste à utiliser la réflexion pour générer un type dynamique au moment de l'exécution. . Ce type est une structure avec un champ anonyme du type d'interface encapsulé et un champ supplémentaire. En manipulant ce type dynamique, nous pouvons obtenir la sortie JSON souhaitée.
func printInterface(val interface{}) { t2 := reflect.StructOf([]reflect.StructField{ {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)}, {Name: "Extra", Type: reflect.TypeOf("")}, }) v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Solution 2 : Marshal-Unmarshal-Marshal
Une solution alternative consiste à rassembler l'entrée valeur, en la désorganisant dans une carte, en ajoutant le champ supplémentaire et en la rassemblant encore une fois.
func printInterface(val interface{}) error { data, err := json.Marshal(val) if err != nil { return err } v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } v2["Extra"] = "text" return json.NewEncoder(os.Stdout).Encode(v2) }
Les deux solutions nous permettent d'ajouter des champs arbitraires à la sortie JSON pour les structures inconnues. La première solution est plus sophistiquée et offre un meilleur contrôle, tandis que la seconde solution est plus simple mais moins performante en raison du double marshalling. En fin de compte, le choix de la solution dépend des exigences spécifiques et des priorités du cas d'utilisation.
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!