2017-02-13 60 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