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

EiE*_*Guy 1 json.net json-deserialization c#-7.0 httpresponsemessage asp.net-core-2.0

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

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

这是失败的代码;

FilesUploadedListResponse fileUploadListResponse = new FilesUploadedListResponse();
string jsonResult = response.Content.ReadAsStringAsync().Result;
fileUploadListResponse = (FilesUploadedListResponse)JsonConvert.DeserializeObject(jsonResult);
Run Code Online (Sandbox Code Playgroud)

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

"Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'FilesUploadedListResponse'."
Run Code Online (Sandbox Code Playgroud)

这是字符串中的实际 Json jsonResult

"{\"uploadedfiles\":[],\"totalResults\":0,\"pageNumber\":0,\"pageSize\":0}"
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

这是我的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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

dbc*_*dbc 10

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

由于反序列化到一个特定的已知类型,你应该改为调用通用的方法JsonConvert.DeserializeObject<FilesUploadedListResponse>(jso??nResult),其反序列化JSON的到指定的.NET类型,如下所示:

string jsonResult = response.Content.ReadAsStringAsync().Result;
var fileUploadListResponse = JsonConvert.DeserializeObject<FilesUploadedListResponse>(jsonResult);
Run Code Online (Sandbox Code Playgroud)