C# Json反序列化到一个子类';s";新";财产

C# Json反序列化到一个子类';s";新";财产,c#,json.net,C#,Json.net,我已经为我的问题寻找了一个解决方案很长一段时间了,我看到了一些我认为可能会解决的想法,但我还没有把它们全部放在一起。值得一提的是,我对C#很陌生 我有一个库,它定义了一组用于将JSON数据反序列化为的模型类。其中一个模型是应用程序,它具有属性公共列表字段{get;set;} 我已经能够创建一个子类的应用程序,我称之为MyApplication。因为我有MyApplication我也希望有MyApplicationField扩展ApplicationField 我已经尝试了几种方法,下面是我认为最

我已经为我的问题寻找了一个解决方案很长一段时间了,我看到了一些我认为可能会解决的想法,但我还没有把它们全部放在一起。值得一提的是,我对C#很陌生

我有一个库,它定义了一组用于将JSON数据反序列化为的模型类。其中一个模型是
应用程序
,它具有属性
公共列表字段{get;set;}

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

我已经尝试了几种方法,下面是我认为最有可能成功的方法(不幸的是没有):

公共类MyApplication:Application
{
新的公共列表字段{get;set;}
}
然后,代码将Json反序列化:

JsonConvert.DeserializeObject<MyApplication>
JsonConvert.DeserializeObject
我希望JSON
Fields
属性的值能够映射到我在子类
MyApplication
中定义的
List
类型的Fields属性中。但是,它被反序列化为基类“
字段
属性(类型为
列表

注意:我无法更改基类


有可能实现我想要的行为吗?

作为默认行为,对我来说很有效。你能提供一个例子来说明这个问题吗

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; }
}
void Main()
{
{
var jsonData=@“{”字段“:[{”MyProp“:”我的prop值“,”Prop1“:”Prop1值“}]}”;
var myApp=JsonConvert.DeserializeObject(jsonData);
Console.WriteLine(myApp.Fields[0].MyProp);/“我的prop值”
Console.WriteLine(((应用程序)myApp.Fields==null);/“True”
}
{
//只是为了确保它不聪明,因为指定了“MyProp”
//我们还将尝试此方法,它可以反序列化为应用程序
var jsonData=@“{”字段“:[{”Prop1“:”Prop1值“}]}”;
var myApp=JsonConvert.DeserializeObject(jsonData);
Console.WriteLine(myApp.Fields[0].Prop1);/“Prop1值”
Console.WriteLine(((应用程序)myApp.Fields==null);/“True”
}
}
公共类MyApplication:应用程序
{
公共新列表字段{get;set;}
}
公共类应用程序
{
公共列表字段{get;set;}
}
公共类MyApplicationField:ApplicationField
{
公共字符串MyProp{get;set;}
}
公共类应用程序字段
{
公共字符串Prop1{get;set;}
}

您的问题有一些相互矛盾的数据。是
MyApplication.Fields
a
List
还是
MyApplicationField
?我的错,我在为帖子总结代码时错过了:)现在更新了!谢谢你的回答。我将尝试您提供的示例,然后尝试确定您的示例与我的代码之间的任何不一致。我会带着结果回来的!我发现我正在实现的库的源代码可以在Github上找到。可以在这里找到应用程序类:显然,bas类将json属性映射到新名称,我想这就是导致我出现问题的原因。我试图在我的子类中使用
[DataMember(Name=“fields”,IsRequired=false)]
,但语法无法识别。我也不确定该使用哪个using指令。我尝试了System.Runtime.Serialization,但运气不好。知道吗?嗯。。。我没有在我的项目中定义引用:$。现在一切都好了。谢谢你帮助我!
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; }
}