2015-12-16 22 views
6

JSON.Net Kullanarak Serileştirme Sırasında Alan ve Özelliklerin Koşullu Olarak Nasıl Tutulduğu Nasıl Sağlanır? JsonIgnoreAttribute'dan devralıyorum, çünkü sealed sınıfı. Ne yapmalıyım?JSON.Net Kullanarak Serileştirme Sırasında Koşulları ve Alanları Yoksaymak Nasıl Yapılır?

+0

sen [ScriptIgnore] (http://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization) kontrol ettin ? – Kurubaran

+0

@Kurubaran evet ama şartlı olarak bir alanı görmezden gelmek istiyorum .. –

cevap

1

: ShouldSerialize ihtiyaçlarınızı uymuyorsa

http://www.newtonsoft.com/json/help/html/ConditionalProperties.htm

public class Employee 
{ 
    public string Name { get; set; } 
    public Employee Manager { get; set; } 

    public bool ShouldSerializeManager() 
    { 
     // don't serialize the Manager property if an employee is their own manager 
     return (Manager != this); 
    } 
} 

, sen ContractResolvers ile serileştirme tam kontrol alabilir: JSON.NET sitesinde iyi bir örnek var cevap. JsonConverter'dan miras alıyorum ve yeni bir çevirici oluşturuyorum.

public class CustomJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var list = (IList)value; 

     JArray s = new JArray(); 

     foreach (var item in list) 
     { 
      JToken token = JToken.FromObject(item); 
      JObject obj = new JObject(); 

      foreach (JProperty prop in token) 
      { 
       if (prop.Name != "Title") // your logic here 
        obj.Add(prop); 
      } 

      s.Add(obj); 
     } 

     s.WriteTo(writer); 

    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType != typeof(IList); 
    } 
} 
11

JSON.NET'in ShouldSerialize -syntax uygulamasını kullanabilirsiniz. Bulduğum http://www.newtonsoft.com/json/help/html/ContractResolver.htm

+2

Bu işe başlamak için hiç şans yoktu, breakpoints bu asla serileştirme sırasında bile çağrılmadığını gösteriyor. – Wobbles

+0

ShouldSerialize-sözdizimi, Foo özelliği için, Foo'nun serileştirilmesi gerekip gerekmediğine dair doğru veya yanlış döndürecek bir ShouldSerializeFoo() yöntemine sahip olacak şekilde bir kuraldır. – CharlieNoTomatoes

İlgili konular