我有以下情况:
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;
}
答案 0 :(得分:2)
我相信在收到您的回复后,您可能会尝试将WidgetBaseDTO
投放到WidgetTypeA
或WidgetTypeB
并且您看到的是空的?如果是,那么您可以在对服务器上的Json格式化程序进行以下设置后尝试...确保在客户端的json格式化程序上进行此设置。
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;
上面的设置会导致WidgetTypeA
或WidgetTypeB
的类型信息被放在线上,这会向客户提供关于被反序列化的对象的实际类型的提示......你可以尝试查看响应的有线格式以获得一个想法...
客户端:
JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;
WidgetBaseDTO baseDTO = resp.Content.ReadAsAsync<WidgetBaseDTO>(new MediaTypeFormatter[] { jsonFormatter }).Result;