C# 如何使RestSharp使用JsonConverter?
我有基类和一些派生类:C# 如何使RestSharp使用JsonConverter?,c#,json,json.net,deserialization,restsharp,C#,Json,Json.net,Deserialization,Restsharp,我有基类和一些派生类: 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;} } 类响应结果 { 公共列表值{get;
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;}
}
类响应结果
{
公共列表值{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;
}
公共类MyConverter:JsonConverter
{
私有静态只读JsonSerializer序列化程序=新JsonSerializer();
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
var jObject=jObject.Load(读卡器);
var typeString=jObject.Value(“类型”);
var requiredType=RecoverType(类型字符串);
返回序列化程序。反序列化(jObject.CreateReader(),requiredType);
}
私有类型RecoverType(类类型)
{
开关(类型)
{
案例1.A1:
返回类型(A1);
案例2.A2:
返回类型(A2);
违约:
抛出新ArgumentOutOfRangeException(nameof(type),type,null);
}
}
公共覆盖布尔CanConvert(类型objectType)
{
返回typeof(A).IsAssignableFrom(objectType)| | typeof(A)==objectType;
}
公共覆盖boolcanwrite=>false;
}
如何告诉RestSharp使用此转换器?我从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);
}
}
}
公共异步任务GetAsync(字符串endpointUrl,CancellationToken CancellationToken=new CancellationToken())
{
var restRequest=新的restRequest()
{
资源=端点URL,
Method=Method.GET
};
AddHeader(“Authorization”,$“bearer{this.tokenHandler.GetToken()}”);
IRestResponse response=wait this.restClient.ExecuteTaskAsync(restRequest,cancellationToken);
开关((int)响应状态代码)
{
当(sc>=200&&sc<300)时的情况int sc:
{
var responseData=JsonConvert.DeserializeObject(response.Content);
返回响应数据;
}
案例401:
{
抛出新的ApiAuthorizationException();
}
违约:
{
抛出新的ApiException(response.StatusCode、endpointUrl、response.Content);
}
}
}
什么是类?@miechooy它是枚举。你能提供枚举吗?@miechooy枚举类{A1=1,A2=2}默认情况下,RestSharp不使用Json.NET。有关如何在restsharp中启用Json.NET的确认和说明,请参阅或。