首页 > 解决方案 > C# Web Api - NUnit 测试 - Newtonsoft.Json.JsonSerializationException

问题描述

我需要反序列化以下 JSON 字符串。

{"status":"success","data":[{"id":4,"domainTitle":"Java","isDeleted":true},{"id":5,"domainTitle":"PHP" ,"isDeleted":true},{"id":6,"domainTitle":"Angular","isDeleted":true}]}

相同的测试代码是:

[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());

帮我解决一下。提前致谢。

标签: c#listjson.netnunitdeserialization

解决方案


您需要创建一个与您的 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());


推荐阅读