C # Web Api - Тестирование NUnit - Newtonsoft.Json.JsonSerializationException - PullRequest
1 голос
/ 24 сентября 2019

Мне нужно десериализовать следующую строку JSON.

{"status": "success", "data": [{"id": 4, "domainTitle": "Java","IsDeleted": истинно}, { "ID": 5, "DOMAINTITLE": "РНР", "IsDeleted": истинно}, { "идентификатор": 6, "DOMAINTITLE": "угловой", "IsDeleted": истинно}]}

Тестовый код для того же:

[Test]
    public async Task TestGetDeletedDomainsAsync_UserDomains_StatusCodeOK()
    {
        using (var adminController = new AdminController(_adminService.Object))
        {
            //act
            var response = _adminController.GetDeletedDomainsAsync();
            var successStatus = await response.Content.ReadAsAsync<SuccessStatus>();
            var returnData = JsonConvert.DeserializeObject<List<Domain>>(successStatus.Data.ToString());
            // assert
            Assert.Multiple(() =>
            {
                Assert.That(response, Is.TypeOf<HttpResponseMessage>());
                Assert.That(returnData, Is.TypeOf<List<Domain>>());
                Assert.AreEqual(response.StatusCode, HttpStatusCode.OK);
                Assert.IsNotNull(successStatus);
                Assert.AreEqual("success", successStatus.Status);
                Assert.IsNotNull(returnData);
                //checking if same object goes to service and also if that service is called once
                _adminService.Verify(s => s.GetDeletedDomains(), Times.Once);
            });
        }
    }

Но когда я пытаюсь использовать десериализатор, он выдает исключение.

Newtonsoft.Json.JsonSerializationException: Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [IMS_NL.Models.Domain] 'потому что для корректной десериализации типу требуется массив JSON (например, [1,2,3]).Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например,массив или список), которые можно десериализовать из объекта JSON.JsonObjectAttribute также можно добавить к типу, чтобы принудительно десериализовать его из объекта JSON.

Строка, отображающая вышеуказанную ошибку: -

var returnData = JsonConvert.DeserializeObject<List<Domain>>(successStatus.Data.ToString());

Помогите мне с решением.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Я думаю, что ваша проблема заключается в объявлении класса Domain.Вы должны определить следующие классы в соответствии с JSON, который вы опубликовали:

public class Domain
{
    public int id { get; set; }
    public string domainTitle { get; set; }
    public bool isDeleted { get; set; }
}

public class Result
{
    public string status { get; set; }
    public List<Domain> data { get; set; }
}


var returnData = JsonConvert.DeserializeObject<Result>(...);

Вы должны заменить ... на JSON, который вы получили из того, что вы называете.

По желанию, вы можете переименовать вышеперечисленные классы так, как считаете нужным.

2 голосов
/ 24 сентября 2019

Вам нужно создать класс, соответствующий вашей строке JSON

public class Answer
{
    public string Status { get; set; }
    public List<Domain> Data { get; set; }
}

public class Domain
{
    public int Id { get; set; }
    public string DomainTitle { get; set; }
    public bool IsDeleted { get; set; }
}

Затем используйте var returnData = JsonConvert.DeserializeObject<Answer>(successStatus.Data.ToString());

...