2013-10-31 23 views
13

我試圖防止在Newtonsoft.Json中使用ShouldSerialize方法將沒有新值賦給它的屬性的類型對象的屬性。但我不知道如何實現它,所以請幫我解決這個...如何爲Object類型的屬性使用ShouldSerialize [MemberName]()方法?

下面是示例代碼

public class Sample1 
{ 
    public String name{get;set;} 
    public int Id{get;set;}; 
} 

這是包含上述類作爲它的屬性

我的一個類
public class Container 
{ 
    public String Cname{get;set;} 
    public Sample1 Sample{get;set;}; 

    public bool ShouldSerializeSample() 
    { 
     //What should I write here to prevent the Sample property from being serialized when its properties are assigned no new values. 

    } 
} 
+0

你是什麼意思「沒有分配新的價值」是什麼意思?你能提供一個例子嗎? –

+0

這意味着Object類型的屬性具有自己的屬性和默認值。 – Madhu

+0

答案將取決於'Sample1'的例子。例如,如果'Sample1'是一個引用類型,默認爲'null',如果'Sample'屬性不是'null',則返回'true',否則返回false。如果'Sample1'是一個帶有自己字段的對象,如果Sample1的任何字段都是非默認值,則返回true,否則返回false。 – William

回答

16

鑑於你的例子類,我想你,你正在尋找的東西是這樣的:

public bool ShouldSerializeSample() 
{ 
    return (Sample != null && (Sample.Id != 0 || Sample.name != null)); 
} 

這是一個工作演示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Container> list = new List<Container> 
     { 
      new Container 
      { 
       Cname = "Will serialize Sample because it has a name", 
       Sample = new Sample1 { name = "sample 1" } 
      }, 
      new Container 
      { 
       Cname = "Will serialize Sample because it has a non-zero Id", 
       Sample = new Sample1 { Id = 2 } 
      }, 
      new Container 
      { 
       Cname = "Will serialize Sample because it has a name and an Id", 
       Sample = new Sample1 { name = "sample 3", Id = 3 } 
      }, 
      new Container 
      { 
       Cname = "Will not serialize Sample because it has default values", 
       Sample = new Sample1() 
      }, 
      new Container 
      { 
       Cname = "Will not serialize Sample because it is null", 
       Sample = null 
      } 
     }; 

     string json = JsonConvert.SerializeObject(list, Formatting.Indented); 
     Console.WriteLine(json); 
    } 
} 

public class Sample1 
{ 
    public String name { get; set; } 
    public int Id { get; set; } 
} 

public class Container 
{ 
    public String Cname { get; set; } 
    public Sample1 Sample { get; set; } 

    public bool ShouldSerializeSample() 
    { 
     return (Sample != null && (Sample.Id != 0 || Sample.name != null)); 
    } 
} 

這裏是輸出:

[ 
    { 
    "Cname": "Will serialize Sample because it has a name", 
    "Sample": { 
     "name": "sample 1", 
     "Id": 0 
    } 
    }, 
    { 
    "Cname": "Will serialize Sample because it has a non-zero Id", 
    "Sample": { 
     "name": null, 
     "Id": 2 
    } 
    }, 
    { 
    "Cname": "Will serialize Sample because it has a name and an Id", 
    "Sample": { 
     "name": "sample 3", 
     "Id": 3 
    } 
    }, 
    { 
    "Cname": "Will not serialize Sample because it has default values" 
    }, 
    { 
    "Cname": "Will not serialize Sample because it is null" 
    } 
] 
+0

@Brain嗨**感謝**的幫助......它的實用性。但是現在我需要在我的'ShouldSerialize'方法中使用'Reflection',如果您有任何想法請分享。 – Madhu

+0

@Madhu你需要更具體。你想用反射來完成什麼? –

相關問題