https://stackoverflow.com/questions/19307752

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
					
public class Program
{
	public static void Main()
	{
		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());

		foreach (GalleryItem item in items)
		{
			Console.WriteLine("id: " + item.id);
			Console.WriteLine("title: " + item.title);
			Console.WriteLine("link: " + item.link);
			if (item.is_album)
			{
				GalleryAlbum album = (GalleryAlbum)item;
				Console.WriteLine("album images (" + album.images_count + "):");
				foreach (GalleryImage image in album.images)
				{
					Console.WriteLine("    id: " + image.id);
					Console.WriteLine("    link: " + image.link);
				}
			}
			Console.WriteLine();
		}
	}
}

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)
    {
        JObject jo = JObject.Load(reader);

        // Using a nullable bool here in case "is_album" is not present on an item
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
        {
            item = new GalleryAlbum();
        }
        else
        {
            item = new GalleryImage();
        }

        serializer.Populate(jo.CreateReader(), item);

        return item;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

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

//[JsonConverter(typeof(GalleryItemConverter))]
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; }
}
;