Maison > développement back-end > C++ > Comment gérer les données JSON avec des valeurs mixtes simples et de tableau pour la même propriété?

Comment gérer les données JSON avec des valeurs mixtes simples et de tableau pour la même propriété?

Linda Hamilton
Libérer: 2025-02-02 21:06:09
original
318 Les gens l'ont consulté

How to Handle JSON Data with Mixed Single and Array Values for the Same Property?

data JSON

Question:

Lors du traitement des données JSON, le même attribut peut souvent être exprimé en une seule valeur, ou il peut être représenté comme un tableau de valeur. Par exemple, les charges valides suivantes obtenues à partir de l'API SendGrid:

"Catégorie" L'attribut illustre ce problème. Pour certains projets, il s'agit d'une chaîne et pour d'autres éléments, c'est un tableau de chaîne. JSON.net fournit deux méthodes pour gérer cette incohérence: modifiez les données transmises ou configurez JSON.net pour accepter les différences.

[
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]
Copier après la connexion
<决> Solution: JSONConveter

La méthode recommandée consiste à utiliser JSONConverrer personnalisé. Définissons une classe pour moderniser les données:

Pour les attributs qui peuvent être un seul élément ou un seul tableau (dans cet exemple, "catégorie"), nous le définissons comme liste

et spécifions un convertisseur personnalisé pour traiter sa modification.

class Item
{
    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("timestamp")]
    public int Timestamp { get; set; }

    [JsonProperty("event")]
    public string Event { get; set; }

    [JsonProperty("category")]
    [JsonConverter(typeof(SingleOrArrayConverter<string>))]
    public List<string> Categories { get; set; }
}
Copier après la connexion
Ce qui suit est la mise en œuvre du convertisseur:

Ce convertisseur détermine si l'étiquette passée dans un tableau ou un seul élément est traitée en conséquence. S'il s'agit d'un tableau, il le convertit en liste

;

class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        if (token.Type == JTokenType.Null)
        {
            return null;
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
Copier après la connexion
Utilisation et sortie

Pour utiliser un convertisseur personnalisé, veuillez mettre à jour le code dérivé comme indiqué ci-dessous:

Le programme sera correctement sérialisé les données JSON, et l'attribut "Catégorie" sera rempli de manière appropriée dans une liste de chaînes pour une seule situation et une seule situation.

Cette méthode fournit une méthode flexible pour traiter les données JSON avec la même propriété avec un type de valeur mixte.

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 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