Rumah >pembangunan bahagian belakang >C++ >Bagaimana saya boleh mengendalikan json.net deserialization satu item atau array untuk harta yang sama?

Bagaimana saya boleh mengendalikan json.net deserialization satu item atau array untuk harta yang sama?

Barbara Streisand
Barbara Streisandasal
2025-02-02 20:46:12437semak imbas

projek tunggal atau pelbagai atribut yang sama dalam json.net

Artikel ini membincangkan cara menggunakan json.net untuk memproses data JSON yang dikembalikan oleh API. Mengambil API Acara SendGrid sebagai contoh, atribut categories boleh menjadi rentetan tunggal atau array rentetan.

Soalan: Dalam data JSON yang dikembalikan oleh API Acara Sendgrid, format atribut

tidak konsisten.

categories Contoh JSON:

Penyelesaian: Custom JsonConverr
<code class="language-json">[
  {
    "email": "test1@example.com",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "test2@example.com",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]</code>

Untuk menyelesaikan masalah ini dengan elegan, penyelesaian terbaik adalah untuk membuat adat

. Penukar boleh mengenal pasti jenis nilai atribut

dan mengubahnya dengan betul ke JsonConverter. categories List<string> Contoh kod:

Kod ini mentakrifkan kelas
<code class="language-csharp">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)}");
        }
    }
}</code>
dan generik

. Item boleh mengendalikan single dan array, dan menukarnya ke SingleOrArrayConverter. Program utama menunjukkan cara menggunakan data Serialization Back Serialization Converter. Perhatikan bahawa penukar ini hanya menyokong degradasi (). SingleOrArrayConverter List<string> CanWrite => false

Atas ialah kandungan terperinci Bagaimana saya boleh mengendalikan json.net deserialization satu item atau array untuk harta yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn