我有一个我不用多个构造函数控制的类型,相当于这个:
public class MyClass
{
private readonly string _property;
private MyClass()
{
Console.WriteLine("We don't want this one to be called.");
}
public MyClass(string property)
{
_property = property;
}
public MyClass(object obj) : this(obj.ToString()) {}
public string Property
{
get { return _property; }
}
}
现在,当我尝试反序列化它时,将调用私有无参数构造函数,并且永远不会设置该属性。测试:
[Test]
public void MyClassSerializes()
{
MyClass expected = new MyClass("test");
string output = JsonConvert.SerializeObject(expected);
MyClass actual = JsonConvert.DeserializeObject<MyClass>(output);
Assert.AreEqual(expected.Property, actual.Property);
}
给出以下输出:
We don't want this one to be called.
Expected: "test"
But was: null
如何修改它,而不更改MyClass
的定义?此外,这种类型是我真正需要序列化的对象定义的深层关键。
答案 0 :(得分:9)
尝试将[JsonConstructor]
属性添加到反序列化时要使用的构造函数中。
在班级中更改此属性:
[JsonConstructor]
public MyClass(string property)
{
_property = property;
}
我刚尝试过,你的测试通过了: - )
如果您无法进行此更改,我猜您需要创建CustomJsonConverter
。 http://james.newtonking.com/json/help/index.html?topic=html/CustomJsonConverter.htm和How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?可能会有所帮助。
以下是创建CustomJsonConverter
:https://stackoverflow.com/a/8312048/234415