Json反序列化为子类的“新”属性

时间:2013-11-02 13:11:26

标签: c# json.net

我已经找了一个问题的解决方案已经有一段时间了,并且看到了一些我认为可能会解决的想法,但我还是无法将它们整合在一起。值得一提的是,我对C#很新。

我有一个库,它定义了一堆模型类,用于将JSON数据反序列化。其中一个模型Application具有属性public List<ApplicationField> Fields { get; set; }

我已经能够创建一个我称之为MyApplication的应用程序子类。由于我有MyApplication,我还希望MyApplicationField扩展ApplicationField

我尝试了一些方法,下面是我认为最有可能成功的方法(不幸的是它没有):

public class MyApplication : Application
{
    new public List<MyApplicationField> Fields { get; set; }
}

然后通过代码对Json进行反序列化:

JsonConvert.DeserializeObject<MyApplication>

我希望JSON Fields属性的值将映射到我在子类List<MyApplicationField>中定义的类型MyApplication的Fields属性中。但是它被反序列化为基类“Fields属性(类型为List<ApplicationField>

注意:我无法更改基类。

是否有可能实现我正在寻找的行为?

1 个答案:

答案 0 :(得分:1)

适用于我,作为默认行为。你能提供一个example来证明这个问题吗?

void Main()
{
    {
        var jsonData = @"{""Fields"":[{""MyProp"":""my prop value"",""Prop1"":""prop 1 value""}]}";
        var myApp = JsonConvert.DeserializeObject<MyApplication>(jsonData);
        Console.WriteLine(myApp.Fields[0].MyProp); // "my prop value"
        Console.WriteLine(((Application)myApp).Fields == null); // "True"
    }
    {
        // just to make sure it's not being clever because "MyProp" is specified
        // we'll try this also, which could be deserialized as an Application
        var jsonData = @"{""Fields"":[{""Prop1"":""prop 1 value""}]}";
        var myApp = JsonConvert.DeserializeObject<MyApplication>(jsonData);
        Console.WriteLine(myApp.Fields[0].Prop1); // "prop 1 value"
        Console.WriteLine(((Application)myApp).Fields == null); // "True"
    }
}

public class MyApplication : Application
{
    public new List<MyApplicationField> Fields { get; set; }
}
public class Application
{
    public List<ApplicationField> Fields { get; set; }
}
public class MyApplicationField : ApplicationField
{
    public string MyProp { get; set; }
}
public class ApplicationField
{
    public string Prop1 { get; set; }
}