C# 从Jobject Newtonsoft继承
从Jobject(Newtonsoft)继承类的existents属性未序列化 为什么Id和Name属性没有序列化C# 从Jobject Newtonsoft继承,c#,serialization,json.net,C#,Serialization,Json.net,从Jobject(Newtonsoft)继承类的existents属性未序列化 为什么Id和Name属性没有序列化 public class Test : JObject { public int Id { get; set; } public string Name { get; set; } } class Program { static void Main(string[] args) { var test = new Test();
public class Test : JObject
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
var test = new Test();
test["new_pro"] = 123456;
test.Id = 1;
test.Name = "Dog";
var r = Newtonsoft.Json.JsonConvert.SerializeObject(test);
// Result = { "new_pro":123456}
}
}
有什么想法吗?无论您想这样做的原因是什么-原因很简单:
JObject
实现了IDictionary
,Json.NET以一种特殊的方式处理这种情况。如果您的类实现了IDictionary
-Json.NET将不会查看类的属性,而是在字典中查找键和值。因此,要修复您的案例,您可以执行以下操作:
public class Test : JObject
{
public int Id
{
get { return (int) this["id"]; }
set { this["id"] = value; }
}
public string Name
{
get { return (string) this["name"]; }
set { this["name"] = value; }
}
}
如果您只想在对象上同时具有动态和静态属性,则无需从JObject继承。相反,请使用JsonExtensionData
属性:
public class Test {
public int Id { get; set; }
public string Name { get; set; }
[JsonExtensionData]
public Dictionary<string, JToken> AdditionalProperties { get; set; } = new Dictionary<string, JToken>();
}
var test = new Test();
test.AdditionalProperties["new_pro"] = 123456;
test.Id = 1;
test.Name = "Dog";
var r = Newtonsoft.Json.JsonConvert.SerializeObject(test);
公共类测试{
公共int Id{get;set;}
公共字符串名称{get;set;}
[JsonExtensionData]
公共字典附加属性{get;set;}=new Dictionary();
}
var测试=新测试();
测试.附加属性[“new_pro”]=123456;
测试Id=1;
test.Name=“Dog”;
var r=Newtonsoft.Json.JsonConvert.SerializeObject(测试);
为什么从JObject继承?只需创建自己的类并将其序列化。@krillgar我想OP希望能够向对象添加动态属性,这就引出了一个问题:当JObject执行任务时,为什么要有一个自定义类?很少有属性是动态的。嗨,这个解决方法对我来说不是个好主意。我的类包含许多属性(列表、嵌套对象等),但不从JObject继承,也不向我们解释为什么您必须这样做,也许我们可以找到另一种解决方法。@Gus我用一个选项扩展了答案,可能这就是您需要的。我决定寻找这个项目。[。感谢您的帮助。我需要为类创建动态属性。[JsonExtensionData]非常完美!我还尝试了从JObject继承的错误尝试。这个解决方案对我来说非常有用。