例如,每个响应都有一个消息属性和一个状态码属性,那么它就是实际数据。
所以,我想要的是
public class ApiResponse<T>
{
public string StatusCode{ get; set; }
public string Message{ get; set; }
public ICollection<T> Data { get; set; }
}
问题是,虽然我可以正确设置“T”,但我无法将反序列化映射到它,因为它期望属性是“用户”或“购买”等,而不是“数据”。我知道我可以设置 JsonProperty[] 装饰器,但问题是这对于 T 来说不是动态的。
如果有
技术上的方法,但它并不比为每个对象创建单独的响应对象更干净,我很乐意继续编写单独的对象;但对我还没有找到的更好的解决方案(如果存在)感兴趣。
JsonConverter
实现来自己处理它。是的,您可以使用包装类等完成各种棘手的事情。我自己做了很多这样的事......但它不是很通用。“
如何编写用于 JSON 序列化的自定义转换器”中概述了基本概念。在两种模式(基本模式和工厂模式)中,工厂模式可让您处理泛型类型。
定义工厂类型后,您可以使用JsonConverter
属性向 json 序列化器/反序列化器发出信号,表明您希望将此特定转换器(或本例中的工厂)与您的类型一起使用:
public class ApiResponseConverterFactory : JsonConverterFactory
{
// refer to the fiddle for details
}
[JsonConverter(typeof(ApiResponseConverterFactory))]
public class ApiResponse<T>
{
public string StatusCode { get; set; } = string.Empty;
public string Message { get; set; } = string.Empty;
public T? Data { get; set; }
// This is just a convenience in case you want to re-serialize.
[JsonIgnore]
public string? DataPropName { get; set; }
}
至于实际代码...