Maison >développement back-end >Golang >Comment gérer les champs JSON incohérents : chaînes ou tableaux de chaînes ?
Désagrégation des champs JSON incohérents avec des tableaux et des chaînes
La désorganisation de JSON peut être difficile lorsque les données sont incohérentes, par exemple lorsqu'un champ peut être soit une chaîne, soit un tableau de chaînes. Pour gérer ce scénario, nous pouvons utiliser diverses stratégies.
Capturer des données variables à l'aide de RawMessage
Pour les champs de types différents, nous pouvons utiliser json.RawMessage pour capturer les champs non analysés. données. Cela nous permet de manipuler le champ après avoir désorganisé le JSON de niveau supérieur.
Masquer les champs avec la balise "-"
Pour masquer le champ "DisplayName" du décodage automatique , nous pouvons utiliser la balise "-" dans la définition de la structure. Cela empêche l'application d'attribuer des valeurs à ce champ lors de la désorganisation de niveau supérieur.
Détermination du type de champ et remplissage
Une fois le JSON de niveau supérieur décodé, nous peut inspecter le type du champ RawDisplayName pour déterminer s’il s’agit d’une chaîne ou d’un tableau. S'il s'agit d'une chaîne, nous la désorganisons en une tranche de chaîne. S'il s'agit d'un tableau, nous joignons les valeurs avec "&&" selon la question d'origine.
Interface Unmarshal personnalisée
Pour les scénarios avec plusieurs champs de types différents, il peut être avantageux d'encapsuler la logique d'analyse dans un type personnalisé qui implémente l'interface json.Unmarshaler. Cela permet un contrôle centralisé du processus de conversion des données.
Exemple d'implémentation
Voici un exemple d'implémentation qui gère le JSON spécifié :
package main import ( "encoding/json" "fmt" "strings" ) type multiString string func (ms *multiString) UnmarshalJSON(data []byte) error { *ms = "" if len(data) > 0 { switch data[0] { case '"': var s string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(s) case '[': var s []string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(strings.Join(s, "&&")) } } return nil } type MyListItem struct { Date string `json:"date"` DisplayName multiString `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` } func main() { var listings MyListings err := json.Unmarshal([]byte(`{ "date": "30 Apr", "display_name": "Mr Smith" },{ "date": "30 Apr", "display_name": ["Mr Smith", "Mr Jones"] }`), &listings) if err != nil { fmt.Println(err) return } fmt.Println(listings) }
En utilisant ces techniques, nous pouvons efficacement désorganiser JSON avec des champs de différents types, garantissant ainsi que l'application peut gérer correctement les données.
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!