我正在使用VS2017中的ASP.NET Core 2.0。
我正在尝试反序列化FilesUploadedListResponse fileUploadListResponse = new FilesUploadedListResponse();
string jsonResult = response.Content.ReadAsStringAsync().Result;
fileUploadListResponse = (FilesUploadedListResponse)JsonConvert.DeserializeObject(jsonResult);
中返回的一些JSON,但我得到一个"无法转换类型的对象..."异常。
这是失败的代码;
"Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'FilesUploadedListResponse'."
最后一行是我得到例外的地方......
jsonResult
以下是字符串"{\"uploadedfiles\":[],\"totalResults\":0,\"pageNumber\":0,\"pageSize\":0}"
中的实际Json:
uploadedFiles
此{
"uploadedFiles": [
{
"id": 1,
"createdTime": "July 10, 2017 02:02:25 PM",
"filename": "20170710_14022507701.jpg",
"sentTime": "July 10, 2017 02:05:11 PM",
"fileSize": "124 KB"
},
{
"id": 2,
"createdTime": "June 05, 2017 09:39:25 AM",
"filename": "20170605_093907701.jpg",
"sentTime": "June 05, 2017 09:40:11 AM",
"fileSize": "1 MB"
}
],
"totalResults": 2,
"pageNumber": 0,
"pageSize": 2
}
数组在此结果中为空,因为尚未上传文件,但我认为将其清空不应该创建异常,是吗?如果它不是空的,它会有类似的响应:
FileUploadListResponse
这是我的public class FilesUploadedListResponse
{
public bool Success { get; set; }
public string Reason { get; set; }
public int StatusCode { get; set; }
public List<UploadedFile> UploadedFiles { get; set; }
public int TotalResults { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
}
课程:
UploadedFile
这是我的public class UploadedFile
{
public int Id { get; set; }
public DateTime CreatedTime { get; set; }
public string Filename { get; set; }
public DateTime? SentTime { get; set; }
public string FileSize { get; set; }
}
课程:
UploadedFiles
我对JSON反序列化的理解是:
元素的大小写在JSON字符串中的值与我尝试反序列化的类对象之间并不重要。
我尝试反序列化的类可以拥有更多属性,即JSON字符串中提供的内容,只要考虑到JSON字符串中的属性。
在尝试反序列化为List<UploadedFile>
我确信这很简单,但我只是没有看到它。我在这里缺少什么?
答案 0 :(得分:3)
当您调用非泛型方法JsonConvert.DeserializeObject(jsonResult)
时,您要求Json.NET将传入的JSON反序列化为自己选择的某种.Net类型 ,足以捕获传入的JSON。它实际上选择的是LINQ to JSON JObject
。由于此类型不是FilesUploadedListResponse
类型的隐式或明确convertible,因此您会看到异常。
由于想要反序列化为特定的已知类型,您应该调用泛型方法JsonConvert.DeserializeObject<FilesUploadedListResponse>(jsonResult)
,其中将JSON反序列化为指定的.NET类型,如下所示:
string jsonResult = response.Content.ReadAsStringAsync().Result;
var fileUploadListResponse = JsonConvert.DeserializeObject<FilesUploadedListResponse>(jsonResult);