Maison > développement back-end > Golang > Comment puis-je éliminer efficacement les champs JSON de chaîne ou de tableau incohérents ?

Comment puis-je éliminer efficacement les champs JSON de chaîne ou de tableau incohérents ?

Mary-Kate Olsen
Libérer: 2024-12-05 14:53:14
original
454 Les gens l'ont consulté

How Can I Efficiently Unmarshal Inconsistent String or Array JSON Fields?

Désorganisation des champs JSON flexibles : conversion de valeurs de chaîne ou de tableau incohérentes

Problème

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.

Solution

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:"-"`
}
Copier après la connexion

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
}
Copier après la connexion

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, "&&")
    }
}
Copier après la connexion

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, "&&")
        }
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal