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

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

DDD
DDDoriginal
2024-12-07 22:31:12628parcourir

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

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!

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