【问题标题】:JSON Serialise With Interfaces c#带有接口的 JSON 序列化 c#
【发布时间】:2018-04-05 21:57:44
【问题描述】:

我有一个似乎无法解决的问题。

我有以下课程

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 类型的实例。 类型是接口或抽象类,不能实例化。

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

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

【问题讨论】:

标签: .net asp.net-web-api json.net


【解决方案1】:

你没有提到使用的序列化程序,所以它可能是 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);
    }
}

可能对你有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多