Maison >développement back-end >Golang >Comment puis-je éliminer efficacement les champs JSON de chaîne ou de tableau incohérents ?
La désorganisation de JSON peut être difficile lorsqu'un champ peut être incohérent, apparaissant comme soit une chaîne, soit un tableau de chaînes. Cette incohérence peut entraîner des erreurs de démarchage, entraînant l'échec de votre application.
Utiliser la capture de données JSON brutes
Utiliser les données json.RawMessage structure pour capturer les différents champs JSON sous forme de données brutes. De plus, utilisez la balise de nom json "-" pour masquer le champ pendant la phase de décodage initiale. structure JSON de niveau sans remplir le champ DisplayName.
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
Analyser l'affichage brut Nom
En fonction du type de données brutes, désorganisez le nom d'affichage dans le format approprié.
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
Gérer le tableau des listes
Intégrez la logique susmentionnée dans une boucle pour gérer un tableau d'objets MyListItem dans un MyListings structure.
if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } // Join arrays with "&&" li.DisplayName = strings.Join(s, "&&") } }
Encapsuler la logique
Pour les occurrences répétées de champs de types différents, envisagez d'encapsuler la logique d'analyse dans un type personnalisé qui implémente l'interface json.Unmarshaler .
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] // Parse raw display name if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } li.DisplayName = strings.Join(s, "&&") } } }
Tableau de poignées Valeurs
Pour conserver la valeur du champ sous forme de tranche de chaînes plutôt que de chaîne jointe, modifiez le type multiString en conséquence.Ces techniques fournissent des méthodes robustes pour gérer les champs JSON incohérents, garantissant déclassement réussi et récupération de données précises.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!