c# - 反序列化 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])反序列化为类型”
解决方案
您的 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
请注意,如果属性名称已经匹配,则不需要所有属性。
推荐阅读
- java - 非控制器类中的 Spring Boot application.properties 自定义变量
- mysql - 使用数据类型为 longtext 的列创建表时 SQL 显示错误
- sql - SQL join sum groupby where
- header - ZLIB 膨胀流头格式
- django - 让 django 外键变化多端
- visual-studio-code - 如何使用 Visual Studio Code 将语言添加到我的路径?
- javascript - 使用 JSON Schema 或 Classes 解析嵌套 JSON
- c++ - 从c ++ api访问八度结构成员
- javascript - 循环到对象数组
- tfs - TFS 2018 在构建触发器中缺少路径过滤器