2012-04-17 43 views

Respuesta

9

Para una respuesta parcial, de jugar con DefaultContractResolver.DefaultMembersSearchFlags puede conseguir que se incluyen cosas privadas:

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

parece funcionar en una gran cantidad de objetos, aunque con algunos esto parece generar una excepción de CLR.

+0

a mí me funcionó. +1. ¿Cómo puedo ahora especificar qué propiedades excluir? Una opción de expresión regular sería aún mejor. – Mukus

3

En respuesta a Chris' answer, la propiedad DefaultMemberSearchFlags en DefaultContractResolverwas deprecated as of version 6. A pesar de lo que dice el mensaje de desaprobación, creo que también deberá sobrescribir el método CreateProperties, como L.B explains.

Este método le da un control completo, incluyendo excluyendo propiedades de sólo lectura:

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