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

Unable to cast object of type Newtonsoft.Json.Linq.JObject even though I am trying to cast to an object with matching properties

我在 VS2017 中使用 ASP.NET Core 2.0。

我正在尝试反序列化 HttpResponseMessage 中返回的某些 JSON,但我收到 "Unable to cast object of type..." 异常。

这是失败的代码;

FilesUploadedListResponse fileUploadListResponse = new FilesUploadedListResponse();
string jsonResult = response.Content.ReadAsStringAsync().Result;
fileUploadListResponse = (FilesUploadedListResponse)JsonConvert.DeserializeObject(jsonResult);

最后一行是我得到异常的地方...

"Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'FilesUploadedListResponse'."

这是字符串 jsonResult 中的实际 Json:

"{\"uploadedfiles\":[],\"totalResults\":0,\"pageNumber\":0,\"pageSize\":0}"

这个结果中的 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 class:

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 class:

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; }
}

我对JSON反序列化的理解是:

  1. JSON 字符串中的值与我尝试反序列化的 class 对象之间的元素大小写无关紧要。

  2. 我正在尝试反序列化的 class 可以具有比 JSON 字符串中提供的更多的属性,只要 JSON 字符串中的属性=64=]字符串都占了。

  3. 一个空子数组,例如 UploadedFiles 数组在尝试反序列化为 List<UploadedFile>

  4. 时不应导致错误

我确信这很简单,但我只是没有看到。我在这里错过了什么?

当您将非泛型方法 JsonConvert.DeserializeObject(jsonResult), you are asking Json.NET to deserialize the incoming JSON into some .Net type of its own choosing that is sufficient to capture the incoming JSON. What it in fact chooses is a LINQ to JSON JObject. Since this type is not implicitly or explicitly convertible 调用到您的 FilesUploadedListResponse 类型时,您会看到异常。

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

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