我最初试着把它用作泛型属性,但有太多问题。
下面是使用基于所提供类型的命名约定的转换器
public class ResponseConverter<T> : JsonConverter<Response<T>> where T : RealmObject {
public override Response<T> ReadJson(JsonReader reader, Type objectType, Response<T> existingValue, bool hasExistingValue, JsonSerializer serializer) {
JObject jObject = JObject.Load(reader);
var typeName = typeof(T).Name;
var propertyName = string.Format("{0}List", typeName);
var response = new Response<T>();
if (jObject.ContainsKey(propertyName) && jObject[propertyName].Type == JTokenType.Array) {
response.responseBody = jObject.Property(propertyName).ToObject<IList<T>>();
} else {
response.responseBody = Enumerable.Empty<T>().ToList();
}
serializer.Populate(jObject.CreateReader(), response);
return response;
}
public override void WriteJson(JsonWriter writer, Response<T> value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}
手动使用会像这样
var response = JsonConvert.DeserializeObject<Response<Contact>>(json, new ResponseConverter<Contact>());
对于不同类型的响应,可以创建派生类并将转换器应用于
就像
[JsonConverter(typeof(ResponseConverter<Contact>))]
public class ContactResponse : Response<Contact> { }
[JsonConverter(typeof(ResponseConverter<Customer>))]
public class CustomerResponse : Response<Customer> { }