serializar que parsear objeto manejo ejecutar deserializar desde construir como c# asp.net asp.net-mvc json asp.net-mvc-4

que - serializar json c#



La serialización correcta de JSON en MVC 4 (3)

Mientras que la API web utiliza JSON.NET, MVC4 usa por defecto el JavaScriptSerializer, y no creo que sea compatible con el cambio a la serialización Camel Case. Compruebe esto: configuración del serializador JSON predeterminado en ASP.NET MVC

Mi sugerencia es que cree un JsonNetResult personalizado como se describe aquí. Usando JSON.NET como el serializador JSON predeterminado en ASP.NET MVC 3, ¿es posible? y cambie la última línea a:

var serializedObject = JsonConvert.SerializeObject( Data, Formatting.Indented, , new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() });

Me gustaría tener JSON serializado correctamente (camelCase) y la posibilidad de cambiar los formatos de fecha si es necesario.

Para Web API es muy fácil: en Global.asax ejecuto el siguiente código

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

Este código, a nivel de canal, maneja la serialización de la manera que me gustaría.

Me gustaría lograr lo mismo en MVC 4: hacer que cualquier JSON devuelto de los métodos de acción del controlador se serialice correctamente. Con un poco de búsqueda encontré el siguiente código para arrojar en el inicio de la aplicación Global.asax:

HttpConfiguration config = GlobalConfiguration.Configuration; Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter); config.Formatters[index] = new JsonMediaTypeFormatter { SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } };

Parece que funciona bien, pero cuando devuelvo JSON desde un controlador, todo es PascalCased. Un simple ejemplo de mi método de acción:

private JsonResult GetJsonTest() { var returnData = dataLayer.GetSomeObject(); return Json(returnData, JsonRequestBehavior.AllowGet); }

¿Estoy haciendo esto mal? ¿Alguna idea de cómo lograr esto a nivel de oleoducto?


Recomendaría usar algo como ServiceStack o Json.NET para manejar la salida Json en su aplicación MVC. Sin embargo, puede escribir fácilmente una clase y anular el método Json utilizando una clase base. Vea mi ejemplo a continuación.

NOTA: con esto, no necesita nada en su archivo Global.ascx.cs.

Clase personalizada JsonDotNetResult:

public class JsonDotNetResult : JsonResult { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List<JsonConverter> { new StringEnumConverter() } }; public override void ExecuteResult(ControllerContext context) { if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("GET request not allowed"); } var response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json"; if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; } if (this.Data == null) { return; } response.Write(JsonConvert.SerializeObject(this.Data, Settings)); } }

Clase de controlador de base:

public abstract class Controller : System.Web.Mvc.Controller { protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonDotNetResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior }; } }

Ahora, en la acción de su controlador, simplemente puede devolver algo así.

return Json(myObject, JsonRequestBehavior.AllowGet);

BAM. Ahora tienes objetos camelcase devueltos con Json :)

NOTA: Hay formas de hacer esto con la configuración del serializador en cada objeto que haga con Json. Pero, ¿quién querría escribir eso cada vez que quiere devolver a Json?


Note that below information is for Asp .Net core

El equipo de .Net anunció recientemente que MVC ahora serializa JSON con nombres de casos de camello por defecto.

Con un par de líneas a continuación, podría habilitar esta funcionalidad:

services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Escribí un pequeño blog sobre el mismo que está here .