.net JSON序列化与c接口#
我有一个似乎无法解决的问题 我有以下课程.net JSON序列化与c接口#,.net,asp.net-web-api,json.net,.net,Asp.net Web Api,Json.net,我有一个似乎无法解决的问题 我有以下课程 public class Foo:IFoo { Private List<IBar> _listTest=new List<IBar>(); Public List<IBar> ListTest { get { return _listTest; } set { _listTest=value; } } } 公共类Foo:IFo
public class Foo:IFoo
{
Private List<IBar> _listTest=new List<IBar>();
Public List<IBar> ListTest
{
get
{
return _listTest;
}
set
{
_listTest=value;
}
}
}
公共类Foo:IFoo
{
私有列表_listTest=新列表();
公共列表测试
{
得到
{
返回列表测试;
}
设置
{
_listTest=值;
}
}
}
当我从mvc应用程序调用webapi并尝试对其进行反序列化时,我得到以下错误
JsonSerializationException:无法创建IBar类型的实例。
类型是接口或抽象类,无法实例化
我知道这可以通过将界面中列表的返回类型更改为list来解决,但这似乎不是一个好主意
反序列化的最佳方法是什么?您没有提到使用的序列化程序,所以可能是JSON.NET:) 人们可能同意或不同意,但我认为应该避免在序列化对象中使用接口。例如,当接口四处飞舞时,更改序列化程序要困难得多 但是
公共类Foo:IFoo
{
[JsonConverter(typeof(JsonKnowType))]
公共列表ListTest{get;set;}
}
与
公共类JsonKnowType:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
返回序列化程序。反序列化(读取器);
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
serializer.Serialize(writer,value);
}
}
可能对你有用
但正如您所注意到的,类型在末尾被显式定义 你看过或看过吗?
public class Foo : IFoo
{
[JsonConverter(typeof(JsonKnowType<List<SomeBarImp>>))]
public List<IBar> ListTest { get; set; }
}
public class JsonKnowType<TConcrete> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<TConcrete>(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
}