[研究][ASP.NET]用 HttpClientFactory 做 RESTful API 呼叫(三)反序列化
2023-03-27
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
********************************************************************************
在某個 RESTful API 呼叫時候,JsonConvert.SerializeObject 反序列化會出現
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[WebApplication1.Models.Contact]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'data.product_class', line 1, position 60.
無法將當前 JSON 對象(例如 {"name":"value"})反序列化為類型 'System.Collections.Generic.List`1[WebApplication1.Models.VerifyData]',因為該類型需要一個 JSON 陣列(例如 [1, 2,3]) 正確反序列化。
要修復此錯誤,請將 JSON 更改為 JSON 陣列(例如 [1,2,3])或更改反序列化類型,使其成為普通的 .NET 類型(例如,不是像整數這樣的原始類型,也不是像這樣的集合類型 可以從 JSON 對象反序列化的陣列或 List<T>)。 JsonObjectAttribute 也可以添加到類型以強制它從 JSON 對象反序列化。
路徑“data.product_class”,第 1 行,位置 60。
簡單的說 JsonConvert.SerializeObject認為 resultString2 不是一個有效的 JSON 陣列。
但此狀況在使用 RestSharp v106 (內含反序列化能力) 並沒有發生;表示 RestSharp v106 的反序列化能力或寬容度勝過 Newtonsoft.Json 套件。
********************************************************************************
下面結構正常
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication1.Models { public class MyModel { } public class ProductListResult { public string message { get; set; } public string describe { get; set; } public List<ProductListData> data { get; set; } } public class ProductListData { public string product_oid { get; set; } public string product_name { get; set; } public string product_level { get; set; } public string product_official_type { get; set; } public string product_type { get; set; } public string product_sub_type { get; set; } public string product_adjust_note { get; set; } } } |
********************************************************************************
這個結構異常
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class MyModel
{
}
public class VerifyResult
{
public string message { get; set; }
public string describe { get; set; }
public List<VerifyData> data { get; set; }
}
public class VerifyData
{
public string product_class { get; set; }
public string product_account { get; set; }
public string product_name { get; set; }
public string contact_account { get; set; }
public string contact_name { get; set; }
public string contact_cellphone { get; set; }
public string contact_mail { get; set; }
public string contact_dept { get; set; }
public string contact_tel { get; set; }
public string contact_extend { get; set; }
public string status { get; set; }
public List<string> contact_category { get; set; }
}
}
|
********************************************************************************
string 的第一個字改大寫成 String,也是不行。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication1.Models { public class MyModel { } public class VerifyResult { public string message { get; set; } public string describe { get; set; } public List<VerifyData> data { get; set; } } public class VerifyData { public string product_class { get; set; } public string product_account { get; set; } public string product_name { get; set; } public string contact_account { get; set; } public string contact_name { get; set; } public string contact_cellphone { get; set; } public string contact_mail { get; set; } public string contact_dept { get; set; } public string contact_tel { get; set; } public string contact_extend { get; set; } public string status { get; set; } public List<String> contact_category { get; set; } } } |
********************************************************************************
改成下面,測試失敗。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication1.Models { public class MyModel { } public class VerifyResult { public string message { get; set; } public string describe { get; set; } public List<VerifyData> data { get; set; } } public class VerifyCategory { public string category_name { get; set; } } public class VerifyData { public string product_class { get; set; } public string product_account { get; set; } public string product_name { get; set; } public string contact_account { get; set; } public string contact_name { get; set; } public string contact_cellphone { get; set; } public string contact_mail { get; set; } public string contact_dept { get; set; } public string contact_tel { get; set; } public string contact_extend { get; set; } public string status { get; set; } public List<VerifyCategory> contact_category { get; set; } } } |
********************************************************************************
改成下面,測試失敗。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class MyModel
{
}
public class VerifyResult
{
public string message { get; set; }
public string describe { get; set; }
public List<VerifyData> data { get; set; }
}
public class VerifyData
{
public string product_class { get; set; }
public string product_account { get; set; }
public string product_name { get; set; }
public string contact_account { get; set; }
public string contact_name { get; set; }
public string contact_cellphone { get; set; }
public string contact_mail { get; set; }
public string contact_dept { get; set; }
public string contact_tel { get; set; }
public string contact_extend { get; set; }
public string status { get; set; }
public string contact_category { get; set; }
}
}
|
********************************************************************************
這是一個敝人實際測試過,真實可用的 Code,只是帳號、密碼、資料、網址做了些變更。
因為 Server 端不是敝人負責,碰到這種情況有點傷腦筋,待研究。
********************************************************************************
補:解決了,和相關人員對照 Server 端的 CODE 後,Client 端
public List<VerifyData> data { get; set; }
改成
public VerifyData data { get; set; }
其實 RestSharp 106 不該讓上面通過,它是錯誤的;結果到了 RestSharp v107 才判斷出它是錯的。
********************************************************************************
(完)
相關
[研究][ASP.NET]用 HttpClientFactory 做 RESTful API 呼叫(三)反序列化
https://shaurong.blogspot.com/2023/03/aspnet-httpclientfactory-restful-api_2.html
[研究][ASP.NET]用 HttpClientFactory 做 RESTful API 呼叫(二)模組化
https://shaurong.blogspot.com/2023/03/aspnet-httpclientfactory-restful-api_27.html
[研究][ASP.NET]用 HttpClientFactory 做 RESTful API 呼叫(一)
https://shaurong.blogspot.com/2023/03/aspnet-httpclientfactory-restful-api.html
[研究]ASP.NET RESTful API: 比較 HTTPClient , RestSharp , WebClient, HttpClientFactory, Flurl, Refit, RestEase
https://shaurong.blogspot.com/2023/03/aspnet-restful-api-httpclient-restsharp.html
[研究][ASP.NET]RestSharp 106 升級 v107疑難排解:未包含 HasValue 的定義
https://shaurong.blogspot.com/2023/03/aspnetrestsharp-106-v107-hasvalue.html
[研究][ASP.NET]用 RestSharp v107 做 RESTful API 呼叫
https://shaurong.blogspot.com/2023/03/aspnet-restsharp-v107-restful-api.html
[研究][ASP.NET]用 HttpClient 做 RESTful API 呼叫
https://shaurong.blogspot.com/2023/03/aspnet-httpclient-restful-api.html
[研究][ASP.NET]ChatGPT,請提供完整 RestSharp v107 範例程式https://shaurong.blogspot.com/2023/03/aspnetchatgpt-restsharp-v107.html
沒有留言:
張貼留言