2017-02-10 47 views
-2

我试图将api响应映射到自定义api类。 Api总是返回这些json字段:具有通用属性的C#类

Success (true/false) 
Paginator (object) 
Data (object) 

好的,首先两个字段都没有问题,因为它们总是相同的。 但数据 - 根据端点 - 一个其它的类(UserGroup等)

对于所有这些端点的,我有这样user.cs等

实体类我怎样才能动态将用户对象映射到上述的ApiResponseClass

如果可能,我不想为每个端点制作ApiResponseClasses

对不起格式,我在手机上。

+2

请尝试给我们提供一些代码 – r1verside

+1

更具体地说,试着给一个[MCVE]。你有没有尝试为所有这些对象做一个基类?你在使用哪个序列化程序?现在,这个问题要么太宽泛,要么不明确。 –

回答

1
public class ApiResponse<T> 
{ 
    public bool Success { get; set;} 
    public object Paginator { get; set;} 
    public T Data { get; set; } 
} 

public class User 
{ 
    public string Name {get;set;} 
    //Other properties 
} 
时,可以使用这样的服务器上

然后取决于g关于你如何从Api中读取你将使用的<ApiResponse<User>>,这意味着ApiReponse中的T Date设置为User类型。

例如如果你使用的HttpClient键入

using (var client = new HttpClient()) 
{ 
    var response = await client.GetAsync("http://yoururl.com") 
    var jsonString = await task.Content.ReadAsStringAsync(); 
    var model = JsonConvert.DeserializeObject<ApiResponse<User>>(jsonString); 
} 
+0

非常感谢。像魅力一样工作。泛型对我来说是新的。 – MikeRoss

4

使用泛型创建类并将Data属性设置为泛型参数。

例如

public class ApiResponse<TData> { 
    public bool Success { get; set; } 
    public object Paginator { get; set; } 
    public TData Data { get; set; } 
} 

public class ApiResponse: ApiResponse<object> { 
} 

,然后可以在端点

public ApiResponse<User> MyUserAction() { ... } 

public ApiResponse<Group> MyGroupAction() { ... } 

或者甚至在客户端反序列化JSON

ApiResponse<User> response = JsonConvert.DeserializeObject<ApiResponse<User>>(json); 
-1

您可以使用泛型:

public class ApiResponse<T> 
{ 
    public bool IsSuccess { get; set; } 
    public object Paginator { get; set; } 
    public T Data { get; set; } 
} 

当API端点将返回User作为回应,只是实例化ApiResponse类:

var response = new ApiResponse<User>