我有以下代码从web api服务获取对象。
在以下代码行
response.Content.ReadAsAsync<CMLandingPage>().Result;
我得到以下异常:
InnerException = {"Could not create an instance of type MLSReports.Models.IMetaData. Type is an interface or abstract class and cannot be instantiated. Path 'BaBrInfo.Series[0].name', line 1, position 262."}
非常感谢任何指针。
CMLandingPage lpInfo = new CMLandingPage();
try
{
using (HttpClient client = new HttpClient())
{
// Add an Accept header for JSON format
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = client.PostAsJsonAsync(LPChartinfoapiURL, criteria.Mlsnums).Result;
}
// Throw exception if not a success code.
response.EnsureSuccessStatusCode();
// Parse the response body.
lpInfo = response.Content.ReadAsAsync<CMLandingPage>().Result;
}
CMLandingPage:
namespace MLSReports.Models
{
public class CMLandingPage
{
public CMLandingPage() { }
public CMColumn BaBrInfo { get; set; }
}
public class CMColumnItem<T> : IMetaData
{
#region Constructors and Methods
public CMColumnItem() { }
#endregion
#region Properties and Fields
public string name { get; set; }
public List<T> data { get; set; }
public string color { get; set; }
#endregion
}
public class CMColumn
{
#region Constructor and Method
public CMColumn()
{
Series = new List<IMetaData>();
}
#endregion
#region Properties and Fields
public string ChartType { get; set; }
public string ChartTitle { get; set; }
public List<IMetaData> Series { get; set; }
#endregion
}
}
答案 0 :(得分:2)
您的CmColumn
班级上有此属性:
public List<IMetaData> Series { get; set; }
WebApi控制器显然正在尝试根据您发送它的参数值构造一个对象。当它到达名为“BaBrInfo.Series [0] .name”的值时,它知道它应该创建一个新的IMetaData
对象,以便它可以设置它的name
并将其添加到{ {1}}属性,但Series
只是一个接口:它不知道要构造什么类型的对象。
尝试将IMetaData
更改为实现该接口的某种具体类型。
答案 1 :(得分:2)
您需要让序列化程序在json有效负载和反序列化器中包含类型以使用包含的类型:
//Serialization
var config = new HttpConfiguration();
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
return Request.CreateResponse(HttpStatusCode.OK, dto, config);
//Deserialization
var formatter = new JsonMediaTypeFormatter
{
SerializerSettings = { TypeNameHandling = TypeNameHandling.Auto }
};
response.Content.ReadAsAsync<CMLandingPage>(new [] { formatter }).Result;
POLYMORPHIC SERIALIZATION USING NEWTON JSON.NET IN HTTPCONTENT