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

本文关键字:错误 对象 未定义 构造函数 参数 实现 反序列化 接口 类型 JSON | 更新日期: 2023-09-27 18:35:48

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

public interface IInterface {...}
public class MyClass : IInterface 
{
   public MyClass() {}
   .
   .
   .
}

我确实在类中定义了无参数构造函数。

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

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

var serializer = new JavaScriptSerializer(new SimpleTypeResolver());
var newObject = serializer.Deserialize(jsonObject, myClass.GetType());

我也尝试过没有SimpletypeResolver()

我看到过一些帖子,它们似乎徘徊在我正在寻找的内容周围,但并不完全存在 - 除非我错过了什么。

MyClass实现接口,则无法在接口中定义默认构造函数。 明白了。 那么如何反序列化MyClass对象呢?

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

您需要告诉您的反序列化程序想要将 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);
    }
}
可以使用

Newtonsoft.Json库来序列化/取消 .NET 对象喜欢这个:

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

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