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