1

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

我正在尝试反序列化一些在 an 返回的 JSON,HttpResponseMessage但我收到“无法转换类型的对象...”异常。

这是失败的代码;

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'."

这是字符串中的实际 Json jsonResult

"{\"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课:

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

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

  1. 在 JSON 字符串中的值和我试图反序列化到的类对象之间,元素的大小写无关紧要。

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

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

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

4

1 回答 1

12

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

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

string jsonResult = response.Content.ReadAsStringAsync().Result;
var fileUploadListResponse = JsonConvert.DeserializeObject<FilesUploadedListResponse>(jsonResult);
于 2018-01-06T19:15:02.937 回答