C# 反序列化JSON并断言响应
本质上,我试图编写一个测试来反序列化对客户对象的JSON响应,并断言名字是“Darron” JSON对象C# 反序列化JSON并断言响应,c#,json,json.net,C#,Json,Json.net,本质上,我试图编写一个测试来反序列化对客户对象的JSON响应,并断言名字是“Darron” JSON对象 { "Id": 615, "Customer": { "Id": 726, "MemberNodeId": 2257, "EmailAddress": "Darron_Lips
{
"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(客户);
Assert.AreEqual(responsea,firstname);
及
var customer=client.Execute(request.Content);
var responsea=JsonConvert.DeserializeObject(客户);
其结果是:
“Newtonsoft.Json.JsonSerializationException:'无法将当前Json数组(例如[1,2,3])反序列化为类型”
试试这个:
var customer = client.Execute(request).Content;
var responsea = JsonConvert.DeserializeObject<List<Root>>(customer);
Assert.AreEqual(responsea[0].Firstname , "Darron");
var customer=client.Execute(request.Content);
var responsea=JsonConvert.DeserializeObject(客户);
Assert.AreEqual(responsea[0].Firstname,“Darron”);
本质上是responsea[0]。Firstname
访问列表的第一个元素
获取它的Firstname
属性,并用值断言,该值似乎是“Darron”
您的第二次尝试本质上是尝试将整个数组转换为一个引发异常的对象
此外,您有一些声明的类型与您的JSON不匹配。您的JSON与您的类不匹配。首先,您应该反序列化到
列表
,但是您还需要修改该类,使其具有Title
属性的子类。此外,身高和体重的数字不能反序列化为int
属性
首先,您的根类是:
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);
请注意,如果属性名称已经匹配,则不需要所有的JsonProperty
属性。示例json缺少开头[
,这是一个C+P错误,还是您的json真的是这样的?从异常错误来看,这似乎是一个问题输入错误。您的json与您的类不匹配。首先,您应该反序列化到列表
,但您还需要修改该类,使Title
属性有一个子类。此外,这些数字或者无法将高度和重量反序列化为int
属性。是否尝试反序列化根对象列表?您会发现其他错误,如定义为字符串而不是CustomerTitle的属性标题以及无法分配给整数(宽度/高度)的某些值但是反序列化是有效的,您可以使用该列表来检查名字property@DavidG没有,很明显,谢谢。问题在于反序列化,你的与他已经尝试过的匹配。第一次尝试不会引发异常,只有第二次会引发异常,尽管我在列表,而不是客户。感谢大家的贡献,我已经用上面的示例实现了它。谢谢,这是有效的。如果这个答案对您有效,那么您应该接受它。请参阅
var responsea = JsonConvert.DeserializeObject<List<Root>>(customer);
Assert.AreEqual(responsea[0].Firstname, "Darron");