2012-04-17 14 views

Odpowiedz

9

uzyskać częściową odpowiedź, brudząc z DefaultContractResolver.DefaultMembersSearchFlags można dostać to m.in. prywatne rzeczy:

Newtonsoft.Json.JsonSerializerSettings jss = new Newtonsoft.Json.JsonSerializerSettings(); 

if (includePrivateMembers) 
{ 
    Newtonsoft.Json.Serialization.DefaultContractResolver dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); 
    dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; 
    jss.ContractResolver = dcr; 
} 

return Newtonsoft.Json.JsonConvert.SerializeObject(o, jss); 

wydaje się działać na wielu obiektach, choć niektóre to wydaje się wygenerować wyjątek CLR.

+0

pracował dla mnie. +1. Jak mogę teraz określić, które właściwości wyłączyć? Opcja regex byłaby jeszcze lepsza. – Mukus

3

W odpowiedzi na Chris' answer, właściwość DefaultMemberSearchFlags na DefaultContractResolverwas deprecated as of version 6. Pomimo tego, co mówi komunikat o wycofaniu, uważam, że będziesz musiał nadpisać również metodę CreateProperties, taką jak L.B explains.

Ta metoda daje pełną kontrolę, włącznie z wyłączeniem właściwości tylko do odczytu:

class PrivateContractResolver : DefaultContractResolver 
{ 
    protected override List<MemberInfo> GetSerializableMembers(Type objectType) 
    { 
     var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 
     MemberInfo[] fields = objectType.GetFields(flags); 
     return fields 
      .Concat(objectType.GetProperties(flags).Where(propInfo => propInfo.CanWrite)) 
      .ToList(); 
    } 

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
      return base.CreateProperties(type, MemberSerialization.Fields); 
    }   
} 
Powiązane problemy