2013-10-31 21 views
13

Newtonsoft.Json'da ShouldSerialize Yöntemini kullanarak özelliklerine atanan yeni değerler içermeyen yazım nesnesinin özelliğini engellemeye çalıştım. Ama burada Object türünde bir özellik için ShouldSerialize [MemberName]() yöntemi nasıl kullanılır?

örnek kod

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

... yani bana bu çözmek için yardım lütfen, nasıl uygulamaya bilmiyorum Ve bu özelliklerini

biri olarak yukarıdaki sınıfını içeren benim sınıf olduğunu
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

Eğer "hayır yeni değerler atanmış" ile ne demek istiyorsunuz? Bir örnek verebilir misiniz? –

+0

Bu, Nesne türü olan özelliğin varsayılan değerlerle kendi özelliklerine sahip olduğu anlamına gelir. – Madhu

+0

Yanıt, 'Sample1' örneğinin ne olduğuna bağlı olacaktır. Örneğin, 'Sample1' bir başvuru türü ve varsayılan değeri "null" ise, 'sample' özelliği 'null' değilse, aksi takdirde false' true' döndürmelisiniz. Eğer 'Sample1' kendi alanları olan bir nesneyse, 'Sample1''in alanlarından herhangi biri 'default' değilse, aksi takdirde' false' '' true' döndürmelisiniz. – William

cevap

16

senin örneğin sınıfları göz önüne alındığında, sen böyle bir şey arıyor düşünüyorum:

public bool ShouldSerializeSample() 
{ 
    return (Sample != null && (Sample.Id != 0 || Sample.name != null)); 
} 
İşte
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)); 
    } 
} 

çıkışı: Buradabir çalışma demo

[ 
    { 
    "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 Merhaba ** Yardımınız için teşekkürler ** Faydalı. Ama şimdi 'ShouldSerialize' Metodu 'Reflection' kullanmam gerekiyor, eğer herhangi bir fikrin varsa lütfen paylaşın. – Madhu

+0

@Madhu Daha spesifik olmanız gerekiyor. Yansıma ile neyi başarmaya çalışıyorsunuz? –

İlgili konular