I have base and some derived classes:
abstract class A
{
public string type{get;}
}
class A1: A
{
type => Classes.A1
}
class A2: A
{
type => Classes.A2
}
and this I expect get in response from outer API:
class ResponseResult
{
public List<A> values{get;set;}
}
but when i read response it get "Cannot create an abstract class" error message. I've already write simple converter
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;
}
How I can tell RestSharp to use this converter?
I deserialize response out of 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);
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.