Web API - 使用继承将JSON转换为复杂对象类型(DTO)

时间:2014-03-29 01:12:58

标签: json asp.net-web-api dto dotnet-httpclient

我有以下情况:

public class WidgetBaseDTO
{
    public int WidgetID
    {
        get;
        set;
    }
}

public class WidgetTypeA : WidgetBaseDTO
{
    public string SomeProperty1
    {
        get;
        set;
    }
}


public class WidgetTypeB : WidgetBaseDTO
{
    public int SomeProperty2
    {
        get;
        set;
    }
}

我的Web服务返回以下仪表板对象,而Widgets集合可以是A或B类型:

public class DashboardDTO
{
    public List<WidgetBaseDTO> Widgets
    {
        get;
        set;
    }
}

我的问题是,虽然客户端收到了正确的JSON内容,这取决于Widget类型,但在阅读响应内容时,它们都被转换为WidgetBaseDTO。将这些对象转换为相关类型的正确方法是什么?

这是响应的读取方式:

string relativeRequestUri = string.Format("api/dashboards/GetDashboard?dashboardID={0}", dashboardID);
using (var client = new HttpClient())
{
    // set client options
    client.BaseAddress = this.BaseUri;
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // make request               
    HttpResponseMessage response = client.GetAsync(relativeRequestUri).Result;
    if (response.IsSuccessStatusCode)
    {                   
        DashboardDTO dashboard = response.Content.ReadAsAsync<DashboardDTO>().Result;
    }

1 个答案:

答案 0 :(得分:2)

我相信在收到您的回复后,您可能会尝试将WidgetBaseDTO投放到WidgetTypeAWidgetTypeB并且您看到的是空的?如果是,那么您可以在对服务器上的Json格式化程序进行以下设置后尝试...确保在客户端的json格式化程序上进行此设置。

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;

上面的设置会导致WidgetTypeAWidgetTypeB的类型信息被放在线上,这会向客户提供关于被反序列化的对象的实际类型的提示......你可以尝试查看响应的有线格式以获得一个想法...

客户端:

JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;
WidgetBaseDTO baseDTO = resp.Content.ReadAsAsync<WidgetBaseDTO>(new MediaTypeFormatter[] { jsonFormatter }).Result;