【问题标题】:How to make RestSharp use a JsonConverter?如何让 RestSharp 使用 JsonConverter?
【发布时间】:2018-11-18 11:25:07
【问题描述】:

我有基类和一些派生类:

abstract class A
{
    public string type{get;}
}

class A1: A
{
    type => Classes.A1
}
class A2: A
{
    type => Classes.A2
}

我希望得到外部 API 的响应:

class ResponseResult
{
     public List<A> values{get;set;}
}

但是当我阅读响应时,它会收到“无法创建抽象类”错误消息。 我已经写了简单的转换器

public class MyConverter: JsonConverter
{
    private static readonly JsonSerializer Serializer = new JsonSerializer();

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        var typeString = jObject.Value<Classes>("type"); 
        var requiredType = RecoverType(typeString);

        return Serializer.Deserialize(jObject.CreateReader(), requiredType);
    }

    private Type RecoverType(Classes type)
    {
        switch (type)
        {
            case Classes.A1:
                return typeof(A1);
            case Classes.A2:
                return typeof(A2);
            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
        }
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(A).IsAssignableFrom(objectType) || typeof(A) == objectType; 
    }

    public override bool CanWrite => false;
}

我如何告诉 RestSharp 使用这个转换器?

【问题讨论】:

标签: c# json json.net deserialization restsharp


【解决方案1】:

我从 restSharp 中反序列化响应:

public async Task<T> GetAsync<T>(string endpointUrl, CancellationToken cancellationToken = new CancellationToken())
    {
        var restRequest = new RestRequest()
        {
            Resource = endpointUrl,
            Method = Method.GET
        };

        restRequest.AddHeader("Authorization", $"bearer {this.tokenHandler.GetToken()}");

        IRestResponse response = await this.restClient.ExecuteTaskAsync(restRequest, cancellationToken);

        switch ((int)response.StatusCode)
        {
            case int sc when (sc >= 200 && sc < 300):
            {
                var responseData = JsonConvert.DeserializeObject<T>(response.Content);
                return responseData;
            }
            case 401:
            {
                throw new ApiAuthorizationException();
            }
            default:
            {
                throw new ApiException(response.StatusCode,endpointUrl, response.Content);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2012-07-09
    相关资源
    最近更新 更多