Maison >développement back-end >C++ >Comment puis-je effectuer la désérialisation JSON polymorphe dans json.net sans informations de type?
La fonctionnalité puissante de JSON.NET permet aux données JSON polymorphes de retour à commande même sans informations de type. Ceci est particulièrement utile lors du traitement des sources de données de différents types de types de types de types, par exemple, l'API Imgur renvoie également la situation de l'image de la galerie et de l'album de galerie. Pour y parvenir, nous avons créé un JSONConverter personnalisé pour gérer le processus instancié. Tout d'abord, nous définissons notre classe de base GalleryItem et sa classe dérivée GalleryImage et Galleryalbum:
Ensuite, nous réalisons notre JsonConverter, GalleryItemConverter:
<code class="language-csharp">public abstract class GalleryItem { public string id { get; set; } public string title { get; set; } public string link { get; set; } public bool is_album { get; set; } } public class GalleryImage : GalleryItem { // 附加的图像特定属性 } public class GalleryAlbum : GalleryItem { public int images_count { get; set; } public List<GalleryImage> images { get; set; } }</code>Le convertisseur vérifie s'il existe une propriété "IS_ALBUM" pour déterminer le type à instanciation. Ensuite, il remplit les attributs de l'objet en fonction des données de l'objet JSON.
Afin de démontrer son utilisation, nous définissons un exemple de l'exemple de données fournies par l'analyse:
<code class="language-csharp">public class GalleryItemConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(GalleryItem).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 解析包含数据的JSON对象 JObject jo = JObject.Load(reader); // 检查是否存在"is_album"以确定对象类型 bool? isAlbum = (bool?)jo["is_album"]; GalleryItem item; if (isAlbum.GetValueOrDefault()) item = new GalleryAlbum(); else item = new GalleryImage(); // 使用JsonSerializer填充对象的属性 serializer.Populate(jo.CreateReader(), item); return item; } // 对于我们的目的,不需要实现CanWrite和WriteJson }</code>
La sortie du programme montre la dégradation réussie de l'image de la galerie et des objets de l'album de la galerie, et le remplissage précis de leurs attributs respectifs.
De cette manière, JSONConverrter personnalisé nous permet de traiter la sérialisation JSON polymorphe JSON sans informations de type explicite, afin que nous puissions collaborer de manière transparente avec différentes sources de données.
<code class="language-csharp">string json = @" [ { ""id"": ""OUHDm"", ""title"": ""My most recent drawing. Spent over 100 hours."", ""link"": ""http://i.imgur.com/OUHDm.jpg"", ""is_album"": false }, { ""id"": ""lDRB2"", ""title"": ""Imgur Office"", ""link"": ""http://alanbox.imgur.com/a/lDRB2"", ""is_album"": true, ""images_count"": 3, ""images"": [ { ""id"": ""24nLu"", ""link"": ""http://i.imgur.com/24nLu.jpg"" }, { ""id"": ""Ziz25"", ""link"": ""http://i.imgur.com/Ziz25.jpg"" }, { ""id"": ""9tzW6"", ""link"": ""http://i.imgur.com/9tzW6.jpg"" } ] } ]"; List<GalleryItem> items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>
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!