C# 如何反序列化实现接口的类类型(JSON)对象:错误未定义无参数构造函数?

C# 如何反序列化实现接口的类类型(JSON)对象:错误未定义无参数构造函数?,c#,json,deserialization,C#,Json,Deserialization,使用C#,.Net v4.0-给定以下结构: public interface IInterface {...} public class MyClass : IInterface { public MyClass() {} . . . } 我确实在类中定义了无参数构造函数 收到JSON对象后,我尝试反序列化MyClass,并收到如下错误: 没有为此对象定义无参数构造函数 我也尝试过不使用SimpletypeResolver() 我看到它似乎在我寻找的东西周围徘徊,

使用C#,.Net v4.0-给定以下结构:

public interface IInterface {...}

public class MyClass : IInterface 
{
   public MyClass() {}
   .
   .
   .
}
我确实在类中定义了无参数构造函数

收到JSON对象后,我尝试反序列化
MyClass
,并收到如下错误:

没有为此对象定义无参数构造函数

我也尝试过不使用
SimpletypeResolver()

我看到它似乎在我寻找的东西周围徘徊,但不完全在那里——除非我错过了什么


MyClass
实现接口,接口中不能定义默认构造函数。知道了。那么如何反序列化
MyClass
对象呢?

您需要告诉反序列化程序需要具体的类类型来将json转换为。一种方法是在Json.Net中实现JsonConverter类

完整的人为工作示例

public interface IMyClass
{
    void SetMyVariable(int value);
}

public class MyClass : IMyClass
{

    public int MyVariable;

    public MyClass()
    {
        MyVariable = 10;
    }

    public void SetMyVariable(int value)
    {
        this.MyVariable = value;
    }
}

public class MyParentClass
{
    public IMyClass IMyClass { get; set; }
}


public class MyClassConverter : JsonConverter
{
    /// <inheritdoc />
    public override bool CanWrite
    {
        get
        {
            return false;
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotSupportedException();
    }

    /// <inheritdoc />
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader == null)
        {
            throw new ArgumentNullException("reader");
        }

        if (serializer == null)
        {
            throw new ArgumentNullException("serializer");
        }

        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        var jsonObject = JObject.Load(reader);
        var value = new MyClass();

        if (value == null)
        {
            throw new JsonSerializationException("No object created.");
        }

        serializer.Populate(jsonObject.CreateReader(), value);
        return value;
    }

    /// <inheritdoc />
    public override bool CanConvert(Type objectType)
    {
        return typeof(IMyClass).IsAssignableFrom(objectType);
    }
}

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void TestSerializer()
    {
        var myClass = new MyParentClass { IMyClass = new MyClass() };
        var serializedClass = JsonConvert.SerializeObject(myClass);
        var result = JsonConvert.DeserializeObject<MyParentClass>(serializedClass, new MyClassConverter());
        Assert.IsNotNull(result);
    }
}
公共接口IMyClass
{
void SetMyVariable(int值);
}
公共类MyClass:IMyClass
{
公共int-MyVariable;
公共MyClass()
{
MyVariable=10;
}
公共void SetMyVariable(int值)
{
this.MyVariable=值;
}
}
公共类MyParentClass
{
公共IMyClass IMyClass{get;set;}
}
公共类MyClassConverter:JsonConverter
{
/// 
公共覆盖布尔可写
{
得到
{
返回false;
}
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotSupportedException();
}
/// 
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
如果(读卡器==null)
{
抛出新的异常(“读取器”);
}
if(序列化程序==null)
{
抛出新的ArgumentNullException(“序列化程序”);
}
if(reader.TokenType==JsonToken.Null)
{
返回null;
}
var jsonObject=JObject.Load(读卡器);
var值=新的MyClass();
如果(值==null)
{
抛出新的JsonSerializationException(“未创建对象”);
}
填充(jsonObject.CreateReader(),值);
返回值;
}
/// 
公共覆盖布尔CanConvert(类型objectType)
{
返回类型(IMyClass).IsAssignableFrom(objectType);
}
}
[测试类]
公共类UnitTest2
{
[测试方法]
public void TestSerializer()
{
var myClass=new MyParentClass{IMyClass=new myClass()};
var serializedClass=JsonConvert.SerializeObject(myClass);
var result=JsonConvert.DeserializeObject(serializedClass,new MyClassConverter());
Assert.IsNotNull(结果);
}
}

您可以使用
Newtonsoft.Json
库来序列化.NET对象 像这样:

var jsonString = JsonConvert.SerializeObject(myObject);
var jsonObject =  JsonConvert.DeserializeObject(jsonString )

此外,还有支持泛型的重载,方便您使用。

向我们展示MyClass的代码。您是否定义了无参数构造函数?我尝试了您的建议,但在使用
反序列化对象…
-无法创建IIInterface类型的实例时,仍会遇到相同的错误。类型是接口或抽象类,无法实例化
MyClass
is
MyClass:IInterface
更新了一个精心设计但在单元测试中确实有效的答案。我最终使用了此处建议的解决方案:,创建了两个泛型类型,并删除了接口。在单元测试期间,这可能会产生一些后果,但它是有效的。不过,我认为你的回答是可以接受的,并且可能在不久的将来重新讨论。非常感谢。
var jsonString = JsonConvert.SerializeObject(myObject);
var jsonObject =  JsonConvert.DeserializeObject(jsonString )