IgnoreDataMemberScriptIgnoreJsonIgnoredependiendo del serializador que use
LB
3
También es digno de mención el atributo [No serializado], que solo es aplicable a los campos (no a las propiedades), pero que tiene el mismo efecto que JsonIgnore.
Triynko
El comentario de Trynko es muy útil ... si usa IgnoreDataMember en un campo, no habrá ningún error, pero no se aplicará.
Tillito
Respuestas:
147
Si está utilizando System.Web.Script.Serializationen .NET Framework , puede poner un ScriptIgnoreatributo en los miembros que no se debe serializar. Vea el ejemplo tomado de aquí :
Encontré ScriptIgnoreen el System.Web.Script.Serializationespacio de nombres.
Sorangwala Abbasali
354
Si está utilizando el atributo Json.Net[JsonIgnore] , simplemente ignorará el campo / propiedad mientras se serializa o deserializa.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
O puede usar el atributo DataContract y DataMember para serializar / deserializar selectivamente propiedades / campos.
[DataContract]publicclassComputer{// included in JSON[DataMember]publicstringName{get;set;}[DataMember]publicdecimalSalePrice{get;set;}// ignoredpublicstringManufacture{get;set;}publicintStockCount{get;set;}publicdecimalWholeSalePrice{get;set;}publicDateTimeNextShipmentDate{get;set;}}
Si yo fuera el OP, preferiría esta respuesta sobre la solución elegida [ScriptIgnore]. Principalmente debido a la congruencia de una solución Json, por lo que es un problema Json. ¿Por qué involucrar System.Web.Extensions cuando la biblioteca que está utilizando proporciona una solución? El mejor en mi humilde opinión es el atributo [IgnoreDataMember], ya que System.Runtime.Serialization debería ser compatible con todos los serializadores en caso de que desee cambiar Json.
Steve H.
IgnoreDataMemberno funciona con el JsonResultserializador predeterminado .
hendryanw
1
NewtonSoft me ayudó completamente. Hizo que mi json se vea limpio sin que se incluyeran propiedades desordenadas de mis modelos que son solo para backend.
Sorangwala Abbasali
1
@JC Raja ¿Cómo puedo ignorar la propiedad durante la desalinización solo cuando esta propiedad es nula
User123456
1
[NewtonSoft.Json] Quiero ignorar solo la serialización. Entonces, ¿alguna solución para esto?
La URL en su respuesta está rota. ¿ [ScriptIgnore]Qué debe usarse en la propiedad si su controlador está usando el controlador MVC base return Json(...?
Don Cheadle
2
Sé que es un comentario antiguo, pero sí, utilícelo [ScriptIgnore]en MVC Controller. Sin embargo, tenga en cuenta que si está utilizando SignalR , también debería usarlo [JsonIgnore].
Sam
22
Lo siento, decidí escribir otra respuesta ya que ninguna de las otras respuestas es lo suficientemente pegable.
Si no desea decorar propiedades con algunos atributos, o si no tiene acceso a la clase, o si desea decidir qué serializar durante el tiempo de ejecución, etc., etc., así es como lo hace en Newtonsoft.Json
//short helper class to ignore some properties from serializationpublicclassIgnorePropertiesResolver:DefaultContractResolver{privateIEnumerable<string> _propsToIgnore;publicIgnorePropertiesResolver(IEnumerable<string> propNamesToIgnore){
_propsToIgnore = propNamesToIgnore;}protectedoverrideJsonPropertyCreateProperty(MemberInfo member,MemberSerialization memberSerialization){JsonProperty property =base.CreateProperty(member, memberSerialization);
property.ShouldSerialize=(x)=>{return!_propsToIgnore.Contains(property.PropertyName);};return property;}}
ACTUALIZACIÓN IMPORTANTE: asegúrese de guardar en caché el ContractResolverobjeto si decide usar esta respuesta, de lo contrario, el rendimiento puede verse afectado.
Si no está tan interesado en tener que decorar el código con Atributos como yo, especialmente cuando no puede decir en tiempo de compilación lo que sucederá aquí es mi solución.
Usando el serializador Javascript
publicstaticclassJsonSerializerExtensions{publicstaticstringToJsonString(thisobject target,bool ignoreNulls =true){var javaScriptSerializer =newJavaScriptSerializer();if(ignoreNulls){
javaScriptSerializer.RegisterConverters(new[]{newPropertyExclusionConverter(target.GetType(),true)});}return javaScriptSerializer.Serialize(target);}publicstaticstringToJsonString(thisobject target,Dictionary<Type,List<string>> ignore,bool ignoreNulls =true){var javaScriptSerializer =newJavaScriptSerializer();foreach(var key in ignore.Keys){
javaScriptSerializer.RegisterConverters(new[]{newPropertyExclusionConverter(key, ignore[key], ignoreNulls)});}return javaScriptSerializer.Serialize(target);}}publicclassPropertyExclusionConverter:JavaScriptConverter{privatereadonlyList<string> propertiesToIgnore;privatereadonlyType type;privatereadonlybool ignoreNulls;publicPropertyExclusionConverter(Type type,List<string> propertiesToIgnore,bool ignoreNulls){this.ignoreNulls = ignoreNulls;this.type = type;this.propertiesToIgnore = propertiesToIgnore ??newList<string>();}publicPropertyExclusionConverter(Type type,bool ignoreNulls):this(type,null, ignoreNulls){}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{this.type }));}}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){var result =newDictionary<string,object>();if(obj ==null){return result;}var properties = obj.GetType().GetProperties();foreach(var propertyInfo in properties){if(!this.propertiesToIgnore.Contains(propertyInfo.Name)){if(this.ignoreNulls && propertyInfo.GetValue(obj,null)==null){continue;}
result.Add(propertyInfo.Name, propertyInfo.GetValue(obj,null));}}return result;}publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){thrownewNotImplementedException();//Converter is currently only used for ignoring properties on serialization}}
Un cambio menor en la lógica y PropertyExclusionConverterse puede convertir en a PropertyInclusionConverter.
Zarepheth
esto es simplemente increíble
SaiKiran Mandhala
Un problema potencial con esto es que tiene que hacer el trabajo de coincidencia de nombres y exclusión una y otra vez cada vez que se serializa un objeto. Sin embargo, una vez compilado, las propiedades de un tipo no cambiarán; debe hacer este cálculo previo, por tipo, de los nombres que deben incluirse y simplemente reutilizar la lista en cada fila. Para un trabajo de serialización JSON muy masivo, el almacenamiento en caché podría marcar una diferencia notable en el rendimiento.
ErikE
9
Si está usando, System.Text.Jsonentonces puede usar [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
La biblioteca está integrada como parte del marco compartido .NET Core 3.0.
Para otros marcos de destino, instale el paquete System.Text.Json NuGet. El paquete admite:
IgnoreDataMember
ScriptIgnore
JsonIgnore
dependiendo del serializador que useRespuestas:
Si está utilizando
System.Web.Script.Serialization
en .NET Framework , puede poner unScriptIgnore
atributo en los miembros que no se debe serializar. Vea el ejemplo tomado de aquí :PD. No olvide agregar una referencia a "
System.Web.Extensions
" para que esto funcionefuente
ScriptIgnore
en elSystem.Web.Script.Serialization
espacio de nombres.Si está utilizando el atributo Json.Net
[JsonIgnore]
, simplemente ignorará el campo / propiedad mientras se serializa o deserializa.O puede usar el atributo DataContract y DataMember para serializar / deserializar selectivamente propiedades / campos.
Consulte http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size para obtener más detalles
fuente
IgnoreDataMember
no funciona con elJsonResult
serializador predeterminado .Puedes usar
[ScriptIgnore]
:Referencia aquí
En este caso, el Id y el nombre solo se serializarán
fuente
[ScriptIgnore]
Qué debe usarse en la propiedad si su controlador está usando el controlador MVC basereturn Json(...
?[ScriptIgnore]
en MVC Controller. Sin embargo, tenga en cuenta que si está utilizando SignalR , también debería usarlo[JsonIgnore]
.Lo siento, decidí escribir otra respuesta ya que ninguna de las otras respuestas es lo suficientemente pegable.
Si no desea decorar propiedades con algunos atributos, o si no tiene acceso a la clase, o si desea decidir qué serializar durante el tiempo de ejecución, etc., etc., así es como lo hace en Newtonsoft.Json
Uso
He publicado el código aquí en caso de que alguien quiera agregar algo
https://github.com/jitbit/JsonIgnoreProps
ACTUALIZACIÓN IMPORTANTE: asegúrese de guardar en caché el
ContractResolver
objeto si decide usar esta respuesta, de lo contrario, el rendimiento puede verse afectado.fuente
Si no está tan interesado en tener que decorar el código con Atributos como yo, especialmente cuando no puede decir en tiempo de compilación lo que sucederá aquí es mi solución.
Usando el serializador Javascript
fuente
PropertyExclusionConverter
se puede convertir en aPropertyInclusionConverter
.Si está usando,
System.Text.Json
entonces puede usar[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Documentos oficiales de Microsoft: JsonIgnoreAttribute
Como se indica aquí :
fuente
También puedes usar el
[NonSerialized]
atributoDe los documentos de MS :
Si está utilizando Unity, por ejemplo ( esto no es solo para Unity ), entonces esto funciona con
UnityEngine.JsonUtility
fuente