net mvc asp asp.net-mvc json

asp.net-mvc - mvc - asp.net core github



¿Cómo evito la serialización JSON en ASP.NET MVC? (5)

El enfoque más limpio que he encontrado es usar una combinación de [DataContract] en la clase y [DataMember] en las propiedades que desea serializar. El atributo DataContract le dice a los distintos serializadores que ignoren cualquier propiedad que no tenga el atributo DataMember.

Hay dos ventajas principales en comparación con el uso de ScriptIgnoreAttribute. Primero, no tiene una dependencia en el ensamblado System.Web.Extensions. En segundo lugar, funciona con otros tipos de serialización, no solo con JSON. Por ejemplo, si está utilizando la nueva API web en MVC 4, el enfoque DataContract / DataMember también funcionará con el serializador XML.

Considere el escenario en el que sus entidades se almacenan en una biblioteca compartida y se reutilizan en varios proyectos: no desea una dependencia en System.Web.Extensions, y desea describir de manera general las reglas de serialización, no el comportamiento de código duro específico de JSON, XML, etc.

Al desarrollar una aplicación MVC de ASP.NET, encuentro algunos lugares donde mis acciones JsonResult producen una excepción "Se detectó una referencia circular al serializar un objeto".

Por ahora, estoy eliminando las referencias en cuestión, pero lo ideal es que simplemente marque la propiedad de manera que el serializador JSON la ignore.

¿Alguien puede sugerir cómo podría hacer esto?


En general, he encontrado que para los objetos complejos es mejor simplemente serializarlos creando un objeto temporal "intermedio":

Por ejemplo para testimonios hago lo siguiente. De hecho, hago esto en el código para mi página de modelo ASPX.

Esto crea un objeto JSON agradable. Notarás que incluso puedo refactorizar mi modelo y la página seguirá funcionando. Es solo otra capa de abstracción entre el modelo de datos y la página. No creo que mi controlador deba saber acerca de JSON tanto como sea posible, pero el ASPX ''codebehind'' ciertamente puede.

/// <summary> /// Get JSON for testimonials /// </summary> public string TestimonialsJSON { get { return Model.Testimonials.Select( x => new { testimonial = x.TestimonialText, name = x.name } ).ToJSON(); } }

En mi ASPX acabo de hacer esto en un bloque:

var testimonials = <%= TestimonialsJSON %>; // oh and ToJSON() is an extension method public static class ObjectExtensions { public static string ToJSON(this Object obj) { return new JavaScriptSerializer().Serialize(obj); } }

Estoy listo para la reacción en contra de esta sugerencia ... tráigala ...

No estoy accediendo a los datos, simplemente reformateando un modelo para la Vista. Esta es la lógica del ''modelo de vista'', no la lógica del ''modelo de controlador''.


Lo que dijo Simon. Agregue una pequeña acción de AutoMapper para mantener el peso del código bajo control.


Yo aconsejaría utilizar JSON.NET . Permite serializar referencias circulares y proporciona muchas más opciones de serialización.