2015-12-16 16 views
6

Làm thế nào để bỏ qua các trường và thuộc tính Điều kiện trong quá trình tuần tự hóa bằng JSON.Net? Tôi không thể kế thừa từ JsonIgnoreAttribute vì đây là lớp học sealed. Tôi nên làm gì?Làm thế nào để bỏ qua các trường và thuộc tính Điều kiện trong quá trình tuần tự hóa bằng JSON.Net?

+0

Bạn đã kiểm tra [ScriptIgnore] (http://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization)? – Kurubaran

+0

@Kurubaran có nhưng tôi muốn bỏ qua một trường điều kiện .. –

Trả lời

1

tôi thấy câu trả lời. Tôi kế thừa từ JsonConverter và tạo trình chuyển đổi mới.

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

Bạn có thể sử dụng JSON.NET's ShouldSerialize -syntax. Có một ví dụ điển hình trên trang web JSON.NET:

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); 
    } 
} 

Nếu ShouldSerialize không phù hợp với nhu cầu của bạn, bạn có thể kiểm soát toàn bộ các serialization với ContractResolvers: http://www.newtonsoft.com/json/help/html/ContractResolver.htm

+2

Không bao giờ có bất kỳ may mắn nhận được điều này để làm việc, breakpoints cho thấy rằng điều này thậm chí không bao giờ được gọi là trong serialization. – Wobbles

+0

Lưu ý rằng cú pháp ShouldSerialize là một quy ước sao cho cho thuộc tính Foo, bạn sẽ có một phương thức ShouldSerializeFoo(), nó sẽ trả về một true hoặc false là liệu Foo có nên được tuần tự hóa hay không. – CharlieNoTomatoes

Các vấn đề liên quan