You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:10:21