Rumah >pembangunan bahagian belakang >C++ >Bagaimana saya boleh mengendalikan json.net deserialization satu item atau array untuk harta yang sama?
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.
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>
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!