Comment désorganiser JSON avec un tableau ou un objet
Lorsque vous traitez JSON, gérer des scénarios dans lesquels les données renvoyées peuvent être un tableau ou un l’objet peut être un défi. Cet article aborde le problème et présente une solution qui implique l'utilisation du type json.RawMessage et un démarshalling dynamique basé sur la structure JSON.
Dévoilement de la structure JSON dynamique
Envisagez les réponses JSON suivantes :
{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
Comme le montrent les réponses, gwrcmd peut être un objet ou un tableau. Pour tenir compte de cela, une structure Go personnalisée est définie comme :
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string
Résoudre l'énigme du démarshalling
La clé pour résoudre ce problème réside dans l'utilisation de json.RawMessage , qui accepte n'importe quelle valeur JSON. Nous créons un wrapper dans la structure Response pour contenir le JSON brut :
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` }
Unmarshaling dynamique basé sur la structure JSON
Dans la méthode UnmarshalJSON de la structure Response, nous examinons le premier octet de RawAWrapper.RawA pour déterminer s'il représente un tableau ou un objet. En fonction du résultat, nous désorganisons les données en conséquence :
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
Cette approche offre une flexibilité dans la gestion de JSON avec différentes structures sans avoir besoin de plusieurs structures.
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!