Ignorar un campo durante la serialización de .NET JSON; similar a [XmlIgnore]?


80

Tengo una clase POCO que se envía al navegador como una cadena JSON en .NET 3.5 sp1. Solo estoy usando la serialización JSON predeterminada y tengo algunos campos que quiero ignorar. Quiero poner un atributo similar a [System.Xml.Serialization.XmlIgnore] en ellos para que no se serialicen.

Respuestas:


121

Utilizo el atributo ScriptIgnore en mi modelo así:

public class Item
{
    [ScriptIgnore]
    public Item ParentItem { get; set; }
}

En este escenario particular, estaba obteniendo un error de referencia circular del serializador Json, así que simplemente lo ignoré. Estaba haciendo una pregunta similar aquí en SO cuando me preocupé por la diferencia entre un modelo y un modelo de vista.


1
¿Qué pasa si no es POCO sino un EntityModel generado? No quiero editar el código generado, ¿hay alguna solución para agregar el atributo ScriptIgnore al modelo de entidad generado?
hazimdikenli

@hazimdikenli, es posible que deba utilizar una clase parcial para esto.
Anand

11
No olvide agregar una referencia a "System.Web.Extensions" para que esto funcione
Levitikon

1
Esto me ayudó a evitar que mi toJson (Modelo) recuperara algunos campos no deseados, pero idealmente con una API, necesitará crear una nueva Área, con un Nuevo Modelo y un controlador para evitar anotaciones cruzadas ... pero soy demasiado vago. Gracias +1
Piotr Kula

27
[ScriptIgnore] 

es tu arándano.


1
En realidad es "Huckle Bearer", pero te daré un +1 por el esfuerzo y la película. :)
Bryan Ray

8
La respuesta original es correcta, dice "arándano", no "portador de huckle". imsdb.com/scripts/Tombstone.html
heisenberg

5
... como en "Huckleberry Finn" - una referencia a la quintaesencia de "todos los hombres", que instintivamente se esfuerza por "hacer lo correcto" - un verdadero amigo con el que siempre puedes contar ... de ahí "Soy tu Huckleberry" , que significa "puedes contar conmigo".
John Holliday

2

Solo necesita agregar el [ScriptIgnore(ApplyToOverrides = true)]en su archivo de plantilla de texto (.tt).

Aquí una parte de mi plantilla de texto antes

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

Una vez que inserté el código, la línea sobre codeStringGeneratormis clases se generó automáticamente y se veía así:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }

También necesitaba modificar la UsingDirectivesfunción para insertar"using System.Web.Script.Serialization;"


ApplyToOverridesparece ser muy importante en una propiedad virtual
Todd

1

Establezca la propiedad como interna. Sin embargo, depende de tu estructura. Tomar en consideración.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.