我正在尝试创建一个通用类,该类可以存储任何类型的传入json的响应以避免开箱,我限制T
必须从RealmObject
派生
public class Response<T> where T : RealmObject
{
public string errorMessage { get; set; }
public string status { get; set; }
public string totalPages {get;set;}
public IList<T> responseBody { get; set; }
}
在这里,responseBody
参数能够存储从Web服务获取的联系人列表,客户或订单数据。为了实现我试图
扩展JsonConverter
以控制反序列化过程。
从服务器收到的Json如下(用于联系人类型数据)
{
"errorMessage": "",
"status": "Ok",
"totalPages": 1,
"contactsList": [
{
"firstName": "Ronald",
"lastName": "Brownn"
},
{
"firstName": "Elvis",
"lastName": "Presley"
}
]
}
以下是我的Contact
模型
[JsonCustomAttribute("contactsList")]
public class Contact : RealmObject
{
public string firstName {get;set;}
public string lastName { get; set; }
}
到目前为止,我正在尝试使用JsonConverter
来反序列化传入的json。在这里您可以看到我必须显式地找到contactsList
属性,然后需要创建具有通用类型Response
的{{1}}对象以将所有Contact
数据添加到
Contact
。因此,有什么方法可以使这些东西通用化,我的意思是动态找到responseBody
或contactList
或customerList
并动态创建orderList
或Response<Contact>
等。 / p>
Response<Customer>
答案 0 :(得分:2)
最初,我尝试将它用作通用属性,但问题太多了。
这是使用基于提供的类型的命名约定的转换器
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> { }