2014-09-09 9 views
9

Dokumentacja Json.NET mówi użyć JsonIgnore nie szeregować pewne właściwości w swoich klasach:Jak mogę nakazać Json.NET zignorować właściwości w obiekcie innej firmy?

public class Account 
{ 
    public string FullName { get; set; } 
    public string EmailAddress { get; set; } 

    [JsonIgnore] 
    public string PasswordHash { get; set; } 
} 

Jak mogę dokonać Json.NET ignorować szczególne właściwości, gdy szeregowania obiektu 3rd-party z JsonConvert.SerializeObject?

+0

Zapraszamy do obejrzenia [IContractResolver] (http://james.newtonking.com/json/help/ index.html? topic = html/ConditionalProperties.htm) –

+0

@GuillaumeCR: Twoja skasowana odpowiedź była dobrym początkiem - wystarczy dodać przykład kodu i będzie to dobra odpowiedź –

+0

@AndrewWhitaker Będę, gdy dostanę minutę, ale teraz połączenia robocze;) –

Odpowiedz

11

Zrób rozpoznawania nazw niestandardowe zamówienia:

public class ShouldSerializeContractResolver : DefaultContractResolver 
{ 
    public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver(); 


    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 
     if (property.DeclaringType == typeof(Account) && property.PropertyName == "PasswordHash") 
     { 
      property.Ignored = true; 
     } 
     return property; 
    } 
} 

Jak przetestować go:

 var account = new Account 
     { 
      PasswordHash = "XXAABB" 
     }; 
     var settings = new JsonSerializerSettings 
     { 
      ContractResolver = ShouldSerializeContractResolver.Instance 
     }; 
     var json = JsonConvert.SerializeObject(account, settings); 
     Console.WriteLine(json); 
+0

Mała optymalizacja: 'jeśli (! property.Ignored && property.DeclaringType == typeof (Account) && property.PropertyName == "PasswordHash") ' –

+0

To trywialne i prawdopodobnie wolniejsze, ponieważ IContractResolver jest wspólny dla wszystkich klas i większość właściwości nie jest ignorowana, więc większość razy tracimy czas sprawdzając '! property.Ignored'. Kontrakt jest również tworzony lazily raz na klasę, więc myślę, że lepiej jest zachować prostotę. – tia