IgnoreDataMemberScriptIgnoreJsonIgnoreselon le sérialiseur que vous utilisez
LB
3
il convient également de noter l'attribut [NonSerialized], qui n'est applicable qu'aux champs (et non aux propriétés), mais a par ailleurs le même effet que JsonIgnore.
Triynko
Le commentaire de Trynko est très utile .... si vous utilisez IgnoreDataMember sur un champ il n'y aura pas d'erreur, mais il ne sera pas appliqué.
Tillito
Réponses:
147
Si vous utilisez System.Web.Script.Serializationdans le framework .NET, vous pouvez mettre un ScriptIgnoreattribut sur les membres qui ne doivent pas être sérialisés. Voir l'exemple tiré d' ici :
J'ai trouvé ScriptIgnoredans l' System.Web.Script.Serializationespace de noms.
Sorangwala Abbasali
355
Si vous utilisez l' attribut Json.Net, vous ignorerez[JsonIgnore] simplement le champ / la propriété lors de la sérialisation ou de la désérialisation.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
Ou vous pouvez utiliser l'attribut DataContract et DataMember pour sérialiser / désérialiser sélectivement les propriétés / champs.
[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 j'étais l'OP, je préférerais cette réponse à la solution [ScriptIgnore] choisie. Principalement en raison de la congruence d'une solution Json donc d'un problème Json. Pourquoi impliquer System.Web.Extensions lorsque la bibliothèque que vous utilisez fournit une solution? Le meilleur IMHO absolu est l'attribut [IgnoreDataMember], car System.Runtime.Serialization devrait être compatible avec tous les sérialiseurs si vous souhaitez échanger Json.
Steve H.
IgnoreDataMemberne fonctionne pas avec le JsonResultsérialiseur par défaut .
hendryanw
1
NewtonSoft vient de m'aider pleinement. Cela a rendu mon json propre sans aucune propriété désordonnée incluse dans mes modèles qui sont juste pour le backend.
Sorangwala Abbasali
1
@JC Raja Comment puis-je ignorer une propriété pendant le dessalement uniquement lorsque cette propriété est nulle
user123456
1
[NewtonSoft.Json] Je souhaite ignorer la sérialisation uniquement. Alors une solution pour ça?
L'URL de votre réponse est cassée. [ScriptIgnore]Qu'est - ce qui devrait être utilisé sur la propriété si votre contrôleur utilise le contrôleur MVC de base return Json(...?
Don Cheadle
2
Je sais que c'est un vieux commentaire, mais oui, utilisez-le [ScriptIgnore]dans MVC Controller. Soyez averti cependant, si vous utilisez SignalR , vous devez [JsonIgnore]également l' utiliser .
Sam
22
Désolé, j'ai décidé d'écrire une autre réponse car aucune des autres réponses n'est suffisamment copiable.
Si vous ne voulez pas décorer les propriétés avec certains attributs, ou si vous n'avez pas accès à la classe, ou si vous voulez décider quoi sérialiser pendant l'exécution, etc. etc. voici comment vous le faites dans 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;}}
MISE À JOUR IMPORTANTE: assurez-vous de mettre en cache l' ContractResolverobjet si vous décidez d'utiliser cette réponse, sinon les performances pourraient en souffrir.
Si vous ne souhaitez pas décorer le code avec des attributs comme je le suis, surtout lorsque vous ne pouvez pas dire au moment de la compilation ce qui se passera ici est ma solution.
Utilisation du sérialiseur 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 changement mineur dans la logique et le PropertyExclusionConverterpeut être transformé en a PropertyInclusionConverter.
Zarepheth
c'est tout simplement génial
SaiKiran Mandhala
Un problème potentiel avec cela est qu'il doit effectuer le travail de correspondance et d'exclusion à chaque fois qu'un objet est sérialisé. Cependant, une fois compilées, les propriétés d'un type ne changeront pas - vous devez pré-calculer, par type, les noms à inclure et réutiliser simplement la liste sur chaque ligne. Pour une tâche de sérialisation JSON très massive, la mise en cache peut faire une différence notable dans les performances.
ErikE
9
Si vous utilisez, System.Text.Jsonvous pouvez utiliser [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
La bibliothèque est intégrée dans le cadre du framework partagé .NET Core 3.0.
Pour les autres frameworks cibles, installez le package System.Text.Json NuGet. Le package prend en charge:
IgnoreDataMember
ScriptIgnore
JsonIgnore
selon le sérialiseur que vous utilisezRéponses:
Si vous utilisez
System.Web.Script.Serialization
dans le framework .NET, vous pouvez mettre unScriptIgnore
attribut sur les membres qui ne doivent pas être sérialisés. Voir l'exemple tiré d' ici :PS. N'oubliez pas d'ajouter une référence à "
System.Web.Extensions
" pour que cela fonctionnela source
ScriptIgnore
dans l'System.Web.Script.Serialization
espace de noms.Si vous utilisez l' attribut Json.Net, vous ignorerez
[JsonIgnore]
simplement le champ / la propriété lors de la sérialisation ou de la désérialisation.Ou vous pouvez utiliser l'attribut DataContract et DataMember pour sérialiser / désérialiser sélectivement les propriétés / champs.
Reportez-vous http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size pour plus de détails
la source
IgnoreDataMember
ne fonctionne pas avec leJsonResult
sérialiseur par défaut .Vous pouvez utiliser
[ScriptIgnore]
:Référence ici
Dans ce cas, l'ID puis le nom ne seront sérialisés
la source
[ScriptIgnore]
Qu'est - ce qui devrait être utilisé sur la propriété si votre contrôleur utilise le contrôleur MVC de basereturn Json(...
?[ScriptIgnore]
dans MVC Controller. Soyez averti cependant, si vous utilisez SignalR , vous devez[JsonIgnore]
également l' utiliser .Désolé, j'ai décidé d'écrire une autre réponse car aucune des autres réponses n'est suffisamment copiable.
Si vous ne voulez pas décorer les propriétés avec certains attributs, ou si vous n'avez pas accès à la classe, ou si vous voulez décider quoi sérialiser pendant l'exécution, etc. etc. voici comment vous le faites dans Newtonsoft.Json
Usage
J'ai publié le code ici au cas où quelqu'un voudrait ajouter quelque chose
https://github.com/jitbit/JsonIgnoreProps
MISE À JOUR IMPORTANTE: assurez-vous de mettre en cache l'
ContractResolver
objet si vous décidez d'utiliser cette réponse, sinon les performances pourraient en souffrir.la source
Si vous ne souhaitez pas décorer le code avec des attributs comme je le suis, surtout lorsque vous ne pouvez pas dire au moment de la compilation ce qui se passera ici est ma solution.
Utilisation du sérialiseur Javascript
la source
PropertyExclusionConverter
peut être transformé en aPropertyInclusionConverter
.Si vous utilisez,
System.Text.Json
vous pouvez utiliser[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Documents officiels de Microsoft: JsonIgnoreAttribute
Comme indiqué ici :
la source
Vous pouvez également utiliser l'
[NonSerialized]
attributDepuis les documents MS :
Si vous utilisez Unity par exemple ( ce n'est pas seulement pour Unity ), cela fonctionne avec
UnityEngine.JsonUtility
la source