public void CanDistinguishItemsBasedOnType()
        {
            var        json   = @"[{
                ""type"": ""PartialOrganization"",
                ""mailbox"": true,
                ""oneDrive"": true,
                ""archiveMailbox"": true,
                ""site"": true,
                ""id"": ""c37da450-6c4b-48c4-87e2-cc557ef5d8975db60525-e59f-49b9-b49b-407fc9bf2642"",
                ""_links"": {}
            }]";
            JsonReader reader = new JTokenReader(JToken.Parse(json));

            var obj    = _sut.ReadJson(reader, typeof(JobItemCollectionDto), null, JsonSerializer.CreateDefault());
            var actual = obj as JobItemCollectionDto;

            var expected = new JobItemCollectionDto();

            expected.PartialOrganizations.Add(new PartialOrganizationJobItemDto()
            {
                ArchiveMailbox = true,
                Id             = "c37da450-6c4b-48c4-87e2-cc557ef5d8975db60525-e59f-49b9-b49b-407fc9bf2642",
                Mailbox        = true,
                OneDrive       = true,
                Site           = true,
                Type           = "PartialOrganization"
            });

            actual.Should().NotBeNull();
            actual.Should().BeEquivalentTo(expected);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return(null);
            }

            if (objectType != typeof(JobItemCollectionDto))
            {
                throw new ArgumentException($"This Json converter can convert only objects of type {nameof(JobItemCollectionDto)}");
            }

            JArray jsonArray = JArray.Load(reader);

            var result = new JobItemCollectionDto();

            foreach (var jObject in jsonArray.Children())
            {
                string type = jObject["type"].ToObject <string>();
                switch (type)
                {
                case "Site":
                    var site = new SiteJobItemDto();
                    JsonSerializer.CreateDefault().Populate(jObject.CreateReader(), site);
                    result.Sites.Add(site);
                    break;

                case "Group":
                    var group = new GroupJobItemDto();
                    JsonSerializer.CreateDefault().Populate(jObject.CreateReader(), group);
                    result.Groups.Add(group);
                    break;

                case "User":
                    var user = new UserJobItemDto();
                    JsonSerializer.CreateDefault().Populate(jObject.CreateReader(), user);
                    result.Users.Add(user);
                    break;

                case "PartialOrganization":
                    var organization = new PartialOrganizationJobItemDto();
                    JsonSerializer.CreateDefault().Populate(jObject.CreateReader(), organization);
                    result.PartialOrganizations.Add(organization);
                    break;

                default:
                    throw new ArgumentException($"Uknown JobItem type \"{type}\".");
                }
            }

            return(result);
        }
        public void CanWriteDifferentObjectsIntoSingleArray()
        {
            var jobItemsCol = new JobItemCollectionDto();

            jobItemsCol.PartialOrganizations.Add(new PartialOrganizationJobItemDto()
            {
                ArchiveMailbox = true,
                Id             = "c37da450-6c4b-48c4-87e2-cc557ef5d8975db60525-e59f-49b9-b49b-407fc9bf2642",
                Mailbox        = true,
                OneDrive       = true,
                Site           = true,
                Type           = "PartialOrganization"
            });
            jobItemsCol.Sites.Add(new SiteJobItemDto()
            {
                Id    = "94f50108-75b4-4a5e-89ae-5651ee1e3975fdc607c4-6ac6-47d9-a1f3-cbdbc9766174",
                Links = null,
                Site  = null,
                Type  = "Site"
            });

            var sb = new StringBuilder();
            var sw = new StringWriter(sb);

            using JsonWriter writer = new JsonTextWriter(sw);
            _sut.WriteJson(writer, jobItemsCol, JsonSerializer.CreateDefault());

            var    expectedJson = @"[{
                ""Type"": ""PartialOrganization"",
                ""Mailbox"": true,
                ""OneDrive"": true,
                ""ArchiveMailbox"": true,
                ""Site"": true,
                ""Id"": ""c37da450-6c4b-48c4-87e2-cc557ef5d8975db60525-e59f-49b9-b49b-407fc9bf2642""
            },
            { 
                ""Type"": ""Site"",
                ""Id"": ""94f50108-75b4-4a5e-89ae-5651ee1e3975fdc607c4-6ac6-47d9-a1f3-cbdbc9766174"",           
                ""_links"": null,
                ""Site"": null
            }]";
            JToken expected     = JToken.Parse(expectedJson);
            JToken actual       = JToken.Parse(sb.ToString());

            JToken.DeepEquals(actual, expected).Should().BeTrue();
        }