Démarrer JSON avec des paires clé/valeur arbitraires à structurer
Problème
Vous avez un Chaîne JSON avec une combinaison de champs connus et inconnus. Vous devez analyser ce JSON et mapper les champs connus à une structure tout en préservant les champs inconnus.
Solution 1 : Double Unmarshal
type KnownFields struct { Known1 string Known2 string } type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns map[string]interface{} `json:"-"` } func ParseMessage(jsonStr string) (*Message, error) { var knownFields KnownFields if err := json.Unmarshal([]byte(jsonStr), &knownFields); err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } delete(m, "known1") delete(m, "known2") return &Message{ Known1: knownFields.Known1, Known2: knownFields.Known2, Unknowns: m, }, nil }
Solution 2 : Démarrer directement vers l'interface Map[string]{}
type Message map[string]interface{} func ParseMessage(jsonStr string) (*Message, error) { var m Message if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } return &m, nil }
Option supplémentaire : Démarrer vers l'interface{}
func ParseMessage(jsonStr string) (interface{}, error) { var m interface{} if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } return m, nil }
Le choix entre ces options dépendent de vos besoins spécifiques. La solution 1 fournit un type de message structuré qui sépare clairement les champs connus et inconnus. La solution 2 offre une approche plus flexible, vous permettant d'accéder à tous les champs sous forme de carte. La solution 3 présente un moyen simplifié de désorganiser le JSON dans une interface non typée, que vous pouvez ensuite gérer selon vos besoins.
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!