2012-06-20 24 views
12

Estoy trabajando en un proyecto ASP.NET WebApi (Release Candidate) donde estoy consumiendo varios DTO que están marcados con el atributo [Serializable]. Estos DTO están fuera de mi control, así que no puedo modificarlos de ninguna manera. Cuando vuelva cualquiera de estos de un método get el JSON resultante contiene un montón de k__BackingFields así:Configuración IgnoreSerializableAttribute Globally en Json.net

<Name>k__BackingField=Bobby 
<DateCreated>k__BackingField=2012-06-19T12:35:18.6762652-05:00 

Sobre la base de la búsqueda que he hecho esto parece una configuración problem with JSON.NET's IgnoreSerializableAttribute y para resolver mi problema sólo necesito para establecerlo globalmente como sugiere el artículo. ¿Cómo cambio esta configuración globalmente en un proyecto de API de ASP.NET Web?

Respuesta

33

Encontré una manera fácil de deshacerse de k__BackingField en los nombres.

Este fragmento debe estar en algún lugar en el Application_Start() en Global.asax.cs:

JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings; 

Parece que la configuración por defecto se encarga de ello.

+1

¡Consejo muy útil para cualquiera que use MVC4/WebApi! – EkoostikMartin

+0

Esto también me solucionó el problema. – bbrown

+0

No funciona para mí. – Estevez

2

Dado que la biblioteca no expone un setter estático para el DefaultContractResolver, le sugiero que cree un contenedor estático sobre JsonConvert y sus métodos Serialize */Deserialize * (al menos los que usa).

En su envoltorio estática se puede definir una resolución de contrato estática:

private static readonly DefaultContractResolver Resolver = new DefaultContractResolver 
{ 
    IgnoreSerializableAttribute = true 
}; 

Esto le puede pasar a cada método de serialización en el JsonSerializerSettings, dentro de su envoltorio. Luego llamas a tu clase a lo largo de tu proyecto.

La alternativa sería obtener el código fuente de JSON.NET y ajustarlo usted mismo para usar ese atributo de manera predeterminada.

+0

Voy a dar que un tiro. ¡Gracias por tu ayuda! – neonbytes

+0

¿Dónde poner esta línea? – Estevez

-2

Amigos, no declaran propiedades de esta manera:

public String DiscretionCode { get; set; } 

Pero, crean auxiliares VARs, como el viejo ....

private String discretionCode; 

public String DiscretionCode 
{ 
    get { return discretionCode;} 
    set { discretionCode = value; } 
} 
+0

Por favor explique su razonamiento –