RestSharp响应反序列化报错:无法将RestResponse转为JsonReader
解决反序列化错误的方案
错误原因
Newtonsoft.Json.JsonSerializer.Deserialize()方法需要**JsonReader类型**的参数,你直接传入RestResponse对象或字符串(response.Content)都会因为类型不匹配触发CS1503错误。
方案1:使用JsonTextReader包装字符串(适配原代码逻辑)
先把响应内容字符串转换成JsonReader,再传入反序列化方法:
public PaymentResponse CreatePaymentRequest(string amount, string mobile, string email, string description, long orderId) { amount = amount.Replace(",", ""); var finalAmount = int.Parse(amount); var siteUrl = _configuration.GetSection("payment")["siteUrl"]; var client = new RestClient($"https://{Prefix}.zarinpal.com/pg/rest/WebGate/PaymentRequest.json"); var request = new RestRequest(siteUrl, Method.Post); request.AddHeader("Content-Type", "application/json"); var body = new PaymentRequest { Mobile = mobile, CallbackURL = $"{siteUrl}/Checkout?handler=CallBack&oId={orderId}", Description = description, Email = email, Amount = finalAmount, MerchantID = MerchantId }; request.AddJsonBody(body); var response = client.Execute(request); // 新增:用StringReader和JsonTextReader包装响应内容 using var stringReader = new StringReader(response.Content); using var jsonReader = new JsonTextReader(stringReader); var jsonSerializer = new JsonSerializer(); return jsonSerializer.Deserialize<PaymentResponse>(jsonReader); }
需要额外导入命名空间:
using System.IO; using Newtonsoft.Json;
方案2:使用JsonConvert.DeserializeObject(更简洁)
直接用Newtonsoft.Json提供的简化方法,无需手动创建JsonSerializer和JsonReader:
public PaymentResponse CreatePaymentRequest(string amount, string mobile, string email, string description, long orderId) { amount = amount.Replace(",", ""); var finalAmount = int.Parse(amount); var siteUrl = _configuration.GetSection("payment")["siteUrl"]; var client = new RestClient($"https://{Prefix}.zarinpal.com/pg/rest/WebGate/PaymentRequest.json"); var request = new RestRequest(siteUrl, Method.Post); request.AddHeader("Content-Type", "application/json"); var body = new PaymentRequest { Mobile = mobile, CallbackURL = $"{siteUrl}/Checkout?handler=CallBack&oId={orderId}", Description = description, Email = email, Amount = finalAmount, MerchantID = MerchantId }; request.AddJsonBody(body); var response = client.Execute(request); // 直接用JsonConvert反序列化字符串 return JsonConvert.DeserializeObject<PaymentResponse>(response.Content); }
方案3:使用RestSharp自带的反序列化(无需手动处理Json)
RestSharp内置了反序列化功能,直接调用ExecuteDeserialize方法即可:
public PaymentResponse CreatePaymentRequest(string amount, string mobile, string email, string description, long orderId) { amount = amount.Replace(",", ""); var finalAmount = int.Parse(amount); var siteUrl = _configuration.GetSection("payment")["siteUrl"]; var client = new RestClient($"https://{Prefix}.zarinpal.com/pg/rest/WebGate/PaymentRequest.json"); var request = new RestRequest(siteUrl, Method.Post); request.AddHeader("Content-Type", "application/json"); var body = new PaymentRequest { Mobile = mobile, CallbackURL = $"{siteUrl}/Checkout?handler=CallBack&oId={orderId}", Description = description, Email = email, Amount = finalAmount, MerchantID = MerchantId }; request.AddJsonBody(body); // 用RestSharp自带的反序列化方法 var response = client.ExecuteDeserialize<PaymentResponse>(request); return response.Data; }
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

