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
Linda Hamiltonoriginal
2025-02-02 21:06:09319parcourir

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.

<code class="language-json">[
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]</code>
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.

<code class="language-csharp">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; }
}</code>
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

;

<code class="language-csharp">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();
    }
}</code>
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:
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