.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);
    }
}