2017-02-13 35 views
2

从Jobject继承(Newtonsoft)未经序列化的类的existents属性。从Jobject继承Newtonsoft

为什么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(); 
     test["new_pro"] = 123456; 
     test.Id = 1; 
     test.Name = "Dog"; 


     var r = Newtonsoft.Json.JsonConvert.SerializeObject(test); 

     // Result = { "new_pro":123456} 

    } 
} 

有什么想法吗?

+3

为什么继承JObject?只需制作你自己的课程并将其序列化即可。 – krillgar

+2

@krillgar我猜OP希望能够向对象添加动态属性,然后引发一个问题:当JObject完成这项工作时,为什么要有一个自定义类? – DavidG

+0

很少有属性是动态的。 – Gus

回答

8

不管是什么原因,你想这样做 - 原因很简单:JObject implements 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); 
+0

嗨,这种解决方法对我来说不是一个好主意。我的类包含许多属性(列表,嵌套对象等) – Gus

+2

那么不要从JObject继承或解释我们为什么你绝对必须这样做,也许我们可以找到另一种解决方法。 – Evk

+0

@Gus我已经扩展了一个选项的答案,可能这就是你需要的。 – Evk