¿Cómo configurar JsonSerializerSettings personalizados para Json.NET en MVC 4 Web API?

Entiendo que ASP.NET Web API usa nativamente Json.NET para (de) serializar objetos, pero ¿hay alguna manera de especificar un objeto JsonSerializerSettings que desee que use?

Por ejemplo, ¿qué pasaría si quisiera incluir información de type en la cadena serial JSON? Normalmente, inyectaría ajustes en la llamada a .Serialize() , pero la API web lo hace de forma silenciosa. No puedo encontrar una forma de inyectar configuraciones manualmente.

Puede personalizar JsonSerializerSettings utilizando la propiedad Formatters.JsonFormatter.SerializerSettings en el objeto HttpConfiguration .

Por ejemplo, puedes hacer eso en el método Application_Start ():

 protected void Application_Start() { HttpConfiguration config = GlobalConfiguration.Configuration; config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; } 

Puede especificar JsonSerializerSettings para cada JsonConvert y puede establecer un valor predeterminado global.

Solo JsonConvert con una sobrecarga:

 // Option #1. JsonSerializerSettings config = new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }; this.json = JsonConvert.SerializeObject(YourObject, Formatting.Indented, config); // Option #2 (inline). JsonConvert.SerializeObject(YourObject, Formatting.Indented, new JsonSerializerSettings() { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore } ); 

Configuración global con código en Application_Start() en Global.asax.cs:

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Formatting = Newtonsoft.Json.Formatting.Indented, ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }; 

Referencia: https://github.com/JamesNK/Newtonsoft.Json/issues/78

La respuesta es agregar estas 2 líneas de código al método Global.asax.cs Application_Start

 var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 

Referencia: manejo de referencias de objetos circulares