Maison >développement back-end >Golang >Comment gérer les champs JSON incohérents : chaînes ou tableaux ?

Comment gérer les champs JSON incohérents : chaînes ou tableaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-05 03:51:13210parcourir

How to Handle Inconsistent JSON Fields: Strings vs. Arrays?

Gestion des champs JSON incohérents : un cas de chaînes par rapport aux tableaux

Lorsque vous traitez des données JSON qui ne sont pas entièrement cohérentes, des défis peuvent survenir dans le processus de démarchage. Cela peut se produire lorsqu'un champ particulier du JSON varie dans son format, ce qui pose des difficultés pour le processus de désorganisation.

Le problème :

Considérez le scénario suivant :

type MyListItem struct {
    Date  string `json:"date"`
    DisplayName       string `json:"display_name"`
}

type MyListings struct {
    CLItems []MyListItem `json:"myitems"`
}

Les données JSON ont un champ appelé "display_name", qui devrait être une chaîne. Cependant, dans certains cas, il peut également s’agir d’un tableau de chaînes. Cette incohérence complique le processus de démarchage, entraînant des erreurs.

La solution :

Pour surmonter ce défi, nous pouvons exploiter deux techniques :

  1. Utilisation de json.RawMessage : Capturez le champ problématique en tant que json.RawMessage type.
  2. Utilisation du nom JSON "-" : Définissez le champ "DisplayName" comme "-" dans le décodeur JSON pour l'exclure du processus de désorganisation.

Mise à jour Code :

type MyListItem struct {
    Date           string          `json:"date"`
    RawDisplayName json.RawMessage `json:"display_name"`
    DisplayName    []string        `json:"-"`
}

Désorganisation du JSON :

Désorganisation du JSON de niveau supérieur :

var li MyListItem
if err := json.Unmarshal(data, &li); err != nil {
    // handle error
}

Extraction du "DisplayName " champ en fonction de son tapez :

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, "&&")
    }
}

Exemple :

var listings MyListings
if err := json.Unmarshal([]byte(data), &listings); err != nil {
    // handle error
}
for i := range listings.CLItems {
    li := &listings.CLItems[i]
    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, "&&")
        }
    }
}

En adoptant ces techniques, vous pouvez gérer efficacement les champs JSON incohérents, garantissant ainsi une extraction et une manipulation appropriées des données dans votre application. .

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