Maison > développement back-end > C++ > Comment puis-je gérer la désérialisation JSON.net d'un seul élément ou un seul tableau pour la même propriété?

Comment puis-je gérer la désérialisation JSON.net d'un seul élément ou un seul tableau pour la même propriété?

Barbara Streisand
Libérer: 2025-02-02 20:46:12
original
487 Les gens l'ont consulté

Projet unique ou tableau du même attribut dans json.net

Cet article examine comment utiliser JSON.net pour traiter les données JSON renvoyées par l'API. Prenant l'exemple de l'API Event SendGrid, son attribut categories peut être une chaîne unique ou un tableau de chaîne.

Question: Dans les données JSON renvoyées par l'API de l'événement SendGrid

, le format de l'attribut

est incohérent. categories

Exemple JSON:

[
  {
    "email": "test1@example.com",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "test2@example.com",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]
Copier après la connexion
Solution: JSONConverr personnalisé

Afin de résoudre ce problème avec élégance, la meilleure solution consiste à créer une coutume

. Le convertisseur peut identifier le type de valeur de l'attribut JsonConverter et le transformer correctement en categories. List<string>

Exemple de code:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

public 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; }
}

public 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 => false; // 只支持反序列化

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

public class Example
{
    public static void Main(string[] args)
    {
        string json = @"
        [
          {
            ""email"": ""test1@example.com"",
            ""timestamp"": 1337966815,
            ""category"": [
              ""newuser"",
              ""transactional""
            ],
            ""event"": ""open""
          },
          {
            ""email"": ""test2@example.com"",
            ""timestamp"": 1337966815,
            ""category"": ""olduser"",
            ""event"": ""open""
          }
        ]";

        List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);

        foreach (var item in items)
        {
            Console.WriteLine($"Email: {item.Email}, Timestamp: {item.Timestamp}, Event: {item.Event}, Categories: {string.Join(", ", item.Categories)}");
        }
    }
}
Copier après la connexion
Ce code définit une classe

et un générique Item. SingleOrArrayConverter peut gérer un seul et un tableau, et le convertir en SingleOrArrayConverter. Le programme principal montre comment utiliser les données JSON de sérialisation arrière du convertisseur. Notez que ce convertisseur ne prend en charge que la dégradation (List<string>). CanWrite => false

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