1

VS2017 で ASP.NET Core 2.0 を使用しています。

で返された 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. 配列などの空のサブ配列はUploadedFilesList<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 に答える