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
Mary-Kate Olsenoriginal
2024-12-05 14:53:14451parcourir

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:"-"`
}

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!

Déclaration:
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