2015-12-16 13 views
6

JSON.Netを使用してシリアル化中にフィールドとプロパティを条件付きで無視する方法 sealedクラスなので、JsonIgnoreAttributeから継承できません。私は何をすべきか?JSON.Netを使用してシリアル化中にフィールドとプロパティを条件付きで無視する方法

+0

あなたは(http://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization)[ScriptIgnore]をチェックしましたか? – Kurubaran

+0

@クルバランはい、私は条件付きでフィールドを無視したいです。 –

答えて

1

私が見つかりました。答え。私はJsonConverterから継承し、新しいコンバータを作成します。

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のShouldSerialize -syntaxを使用できます。 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); 
    } 
} 

ShouldSerializeがニーズに合わない場合は、あなたがContractResolversと直列化の完全な制御を取ることができます:http://www.newtonsoft.com/json/help/html/ContractResolver.htm

+2

これが動作することは決してありませんでしたが、ブレークポイントはシリアル化中に呼び出されないことを示しています。 – Wobbles

+0

ShouldSerialize構文は、プロパティFooに対して、Fooをシリアル化する必要があるかどうかをtrueまたはfalseで返すShouldSerializeFoo()メソッドを持つような規則です。 – CharlieNoTomatoes

関連する問題