无法转换类型为Newtonsoft.Json.Linq.JObject的对象,即使我试图转换为具有匹配属性的对象

时间:2018-01-06 18:55:34

标签: json.net asp.net-core-2.0 json-deserialization c#-7.0 httpresponsemessage

我正在使用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反序列化的理解是:

  1. 元素的大小写在JSON字符串中的值与我尝试反序列化的类对象之间并不重要。

  2. 我尝试反序列化的类可以拥有更多属性,即JSON字符串中提供的内容,只要考虑到JSON字符串中的属性。

  3. 在尝试反序列化为List<UploadedFile>

  4. 时,空的子数组(例如{{1}}数组)不应导致错误

    我确信这很简单,但我只是没有看到它。我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

当您调用非泛型方法JsonConvert.DeserializeObject(jsonResult)时,您要求Json.NET将传入的JSON反序列化为自己选择的某种.Net类型 ,足以捕获传入的JSON。它实际上选择的是LINQ to JSON JObject。由于此类型不是FilesUploadedListResponse类型的隐式或明确convertible,因此您会看到异常。

由于想要反序列化为特定的已知类型,您应该调用泛型方法JsonConvert.DeserializeObject<FilesUploadedListResponse>(jso‌​nResult),其中将JSON反序列化为指定的.NET类型,如下所示:

string jsonResult = response.Content.ReadAsStringAsync().Result;
var fileUploadListResponse = JsonConvert.DeserializeObject<FilesUploadedListResponse>(jsonResult);