2012-04-17 14 views

Antwort

9

Für eine Teilantwort, mit DefaultContractResolver.DefaultMembersSearchFlags Unordnung kann es private Dinge schließen erhalten:

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

scheint auf eine Menge von Objekten zu arbeiten, wenn auch mit einigen dieser eine CLR-Ausnahme zu erzeugen scheint.

+0

für mich gearbeitet. +1. Wie kann ich jetzt angeben, welche Eigenschaften ausgeschlossen werden sollen? Eine Regex-Option wäre noch besser. – Mukus

3

Als Antwort auf Chris' answer, die DefaultMemberSearchFlags Eigenschaft auf DefaultContractResolverwas deprecated as of version 6. Trotz dem, was die deprecation Botschaft sagt, ich glaube, Sie werden die CreateProperties Methode überschrieben werden müssen, auch, wie L.B explains.

Diese Methode gibt Ihnen die volle Kontrolle, einschließlich ohne Nur-Lese-Eigenschaften:

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