2

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では、どうすればオブジェクトをデシリアライズできますか?

4

2 に答える 2

3

デシリアライザーに、json を変換する具体的なクラス型が必要であることを伝える必要があります。これを行う 1 つの方法は、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);
    }
}
于 2013-10-16T13:53:09.517 に答える