2023年3月27日 星期一

[研究][ASP.NET]用 HttpClientFactory 做 RESTful API 呼叫(三)反序列化

[研究][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



沒有留言:

張貼留言