【问题标题】:C# Web Api - NUnit Testing - Newtonsoft.Json.JsonSerializationExceptionC# Web Api - NUnit 测试 - Newtonsoft.Json.JsonSerializationException
【发布时间】:2019-09-24 09:00:51
【问题描述】:

我需要反序列化以下 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&lt;List&lt;Domain&gt;&gt;(successStatus.Data.ToString());

帮我解决。提前致谢。

【问题讨论】:

  • SuccessStatus 的类定义是什么?
  • @User965207 successStatus 是我用来声明状态结果的局部变量类型,采用 json 格式。

标签: c# list json.net nunit deserialization


【解决方案1】:

您需要创建一个与您的 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&lt;Answer&gt;(successStatus.Data.ToString());

【讨论】:

    【解决方案2】:

    我认为您的问题在于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。

    您可以选择重命名上述类,因为您认为这样会更合适。

    【讨论】:

    • @AnshikaGoyal 欢迎您。我很高兴能帮上忙:)
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2018-03-26
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多