带接口的JSON Serialise c#

时间:2018-04-05 21:57:44

标签: .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;
    }
  }
}

当我从mvc应用程序进行webapi调用并尝试反序列化时,我收到以下错误

  

JsonSerializationException:无法创建IBar类型的实例。   Type是接口或抽象类,无法实例化。

我知道这可以通过将接口列表的返回类型更改为List来修复,但这似乎不是一个好主意。

将反序列化的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

你没有提到使用过的序列化程序,所以它可以说是JSON.NET :)

人们可能会同意或不同意,但在我看来,应该避免使用对象中的接口。例如,当接口飞来飞去时,更难以改变串行器。

但是

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

可能对您有用。

但是你可以注意到,在最后明确定义了类型。