首页 > 解决方案 > 反序列化 JSON 并断言响应

问题描述

本质上,我正在尝试编写一个测试来反序列化对 Customer 对象的 JSON 响应并断言 Firstname 是“Darron”

JSON 对象

  {
        "Id": 615,
        "Customer": {
            "Id": 726,
            "MemberNodeId": 2257,
            "EmailAddress": "Darron_Lips@email.com",
            "Deleted": false,
            "LastModifiedBy": "CUSTOMER",
            "LastModifiedOn": "2021-06-02T08:54:38.243Z",
            "CreatedBy": "CUSTOMER",
            "CreatedOn": "2021-06-02T08:54:38.243Z"
        },
        "Title": {
            "Id": 1,
            "Title": "Mr"
        },
        "Firstname": "Darron",
        "Lastname": "Lips",
        "Gender": "Male",
        "DateOfBirth": "1977-11-21T00:00:00Z",
        "Height": 241.000000000,
        "Weight": 204.000000000,
        "LastModifiedBy": "CUSTOMER",
        "LastModifiedOn": "2021-06-02T08:54:38.257Z",
        "CreatedBy": "CUSTOMER",
        "CreatedOn": "2021-06-02T08:54:38.257Z"
    }
]

客户模型

   public class Customer
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("MemberNodeId")]
        public int MemberNodeId { get; set; }

        [JsonProperty("EmailAddress")]
        public string EmailAddress { get; set; }

        [JsonProperty("Deleted")]
        public bool Deleted { get; set; }

        [JsonProperty("LastModifiedBy")]
        public string LastModifiedBy { get; set; }

        [JsonProperty("LastModifiedOn")]
        public DateTime LastModifiedOn { get; set; }

        [JsonProperty("CreatedBy")]
        public string CreatedBy { get; set; }

        [JsonProperty("CreatedOn")]
        public DateTime CreatedOn { get; set; }
    }

    public class CustomerTitle
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("Title")]
        public string Title { get; set; }
    }

    public class Root
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("Customer")]
        public Customer Customer { get; set; }

        [JsonProperty("Title")]
        public string Title { get; set; }

        [JsonProperty("Firstname")]
        public string Firstname { get; set; }

        [JsonProperty("Lastname")]
        public string Lastname { get; set; }

        [JsonProperty("Gender")]
        public string Gender { get; set; }

        [JsonProperty("DateOfBirth")]
        public DateTime DateOfBirth { get; set; }

        [JsonProperty("Height")]
        public int Height { get; set; }

        [JsonProperty("Weight")]
        public int Weight { get; set; }

        [JsonProperty("LastModifiedBy")]
        public object LastModifiedBy { get; set; }

        [JsonProperty("LastModifiedOn")]
        public DateTime LastModifiedOn { get; set; }

        [JsonProperty("CreatedBy")]
        public string CreatedBy { get; set; }

        [JsonProperty("CreatedOn")]
        public DateTime CreatedOn { get; set; }
    }

}

和测试

  [Test]
        public void CanGetCustomerDetails()
        {
            RestClient client = new RestClient(baseUrl);
            RestRequest request = new RestRequest("CustomerDetailsApi/GetAll", Method.GET);
            request.AddHeader("Authorization", $"Bearer {token}");
            IRestResponse response = client.Execute(request);

       
        }

到目前为止我已经尝试过

  var customer = client.Execute(request).Content;
        var responsea = JsonConvert.DeserializeObject<List<Customer>>(customer);
        Assert.AreEqual(responsea, "firstname");

   var customer = client.Execute(request).Content;
            var responsea = JsonConvert.DeserializeObject<Customer>(customer);

这导致:

“Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型”

标签: c#jsonjson.net

解决方案


您的 JSON 与您的课程不匹配。首先,您应该反序列化为List<Root>,但您还需要修改该类以具有该Title属性的子类。此外,身高和体重的这些数字不能反序列化为int属性。

所以首先,是你的Root课:

public class Root
{
    public int Id { get; set; }
    public Customer Customer { get; set; }
    public CustomerTitle Title { get; set; } // Correct type used here
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Gender { get; set; }
    public DateTime DateOfBirth { get; set; }
    public double Height { get; set; } // double rather than int
    public double Weight { get; set; } // double rather than int
    public object LastModifiedBy { get; set; }
    public DateTime LastModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
}

现在反序列化为正确的类型:

var responsea = JsonConvert.DeserializeObject<List<Root>>(customer);

现在你可以断言这样的事情:

Assert.AreEqual(responsea[0].Firstname, "Darron");

JsonProperty请注意,如果属性名称已经匹配,则不需要所有属性。


推荐阅读