IgnoreDataMemberScriptIgnoreJsonIgnoreabhängig von dem Serializer, den Sie verwenden
LB
3
Bemerkenswert ist auch das Attribut [NonSerialized], das nur für Felder (keine Eigenschaften) gilt, ansonsten aber den gleichen Effekt wie JsonIgnore hat.
Triynko
Der Kommentar von Trynko ist sehr nützlich. Wenn Sie IgnoreDataMember für ein Feld verwenden, wird kein Fehler angezeigt, aber er wird nicht angewendet.
Tillito
Antworten:
147
Wenn Sie System.Web.Script.Serializationin .NET Framework verwenden , können Sie ScriptIgnoreden Mitgliedern ein Attribut zuweisen, das nicht serialisiert werden soll. Siehe das Beispiel von hier :
Betrachten Sie den folgenden (vereinfachten) Fall:
Ich habe ScriptIgnoreim System.Web.Script.SerializationNamespace gefunden.
Sorangwala Abbasali
354
Wenn Sie das Json.Net- Attribut verwenden, [JsonIgnore]wird das Feld / die Eigenschaft beim Serialisieren oder Deserialisieren einfach ignoriert.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
Sie können auch die Attribute DataContract und DataMember verwenden, um Eigenschaften / Felder selektiv zu serialisieren / deserialisieren.
[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;}}
Wenn ich der OP wäre, würde ich diese Antwort der gewählten [ScriptIgnore] -Lösung vorziehen. In erster Linie aufgrund der Kongruenz einer Json-Lösung also ein Json-Problem. Warum System.Web.Extensions einbeziehen, wenn die von Ihnen verwendete Bibliothek eine Lösung bietet? Das absolut beste IMHO ist das Attribut [IgnoreDataMember], da System.Runtime.Serialization mit jedem Serializer kompatibel sein sollte, falls Sie Json austauschen möchten.
Steve H.
IgnoreDataMemberfunktioniert nicht mit dem Standard- JsonResultSerializer.
Hendryanw
1
NewtonSoft hat mir nur voll geholfen. Dadurch sah mein JSON sauber aus, ohne dass meine Modelle, die nur für das Backend gedacht sind, unordentliche Eigenschaften aufwiesen.
Sorangwala Abbasali
1
@ JC Raja Wie kann ich Eigenschaft während der Entsalzung nur ignorieren, wenn diese Eigenschaft null ist
user123456
1
[NewtonSoft.Json] Ich möchte nur die Serialisierung ignorieren. Dann eine Lösung dafür?
Die URL in Ihrer Antwort ist fehlerhaft. Ist [ScriptIgnore]was soll auf dem Grundstück verwendet werden , wenn der Controller die Basis MVC - Controller verwendet return Json(...?
Don Cheadle
2
Ich weiß, dass es ein alter Kommentar ist, aber ja, [ScriptIgnore]in MVC Controller verwenden. Seien Sie jedoch gewarnt, wenn Sie SignalR verwenden , sollten Sie auch verwenden [JsonIgnore].
Sam
21
Entschuldigung, ich habe beschlossen, eine andere Antwort zu schreiben, da keine der anderen Antworten kopierfähig genug ist.
Wenn Sie Eigenschaften nicht mit einigen Attributen dekorieren möchten oder wenn Sie keinen Zugriff auf die Klasse haben oder wenn Sie entscheiden möchten, was zur Laufzeit serialisiert werden soll, usw. usw., gehen Sie wie folgt in Newtonsoft.Json vor
//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;}}
WICHTIGES UPDATE: Stellen Sie sicher, dass Sie das ContractResolverObjekt zwischenspeichern, wenn Sie diese Antwort verwenden. Andernfalls kann die Leistung beeinträchtigt werden.
Wenn Sie nicht so sehr daran interessiert sind, Code mit Attributen zu dekorieren wie ich, ist es meine Lösung, wenn Sie zum Zeitpunkt der Kompilierung nicht sagen können, was hier passieren wird.
Verwenden des Javascript Serializer
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}}
Eine geringfügige Änderung in der Logik und der PropertyExclusionConverterkann in eine umgewandelt werden PropertyInclusionConverter.
Zarepheth
Das ist einfach großartig
SaiKiran Mandhala
Ein mögliches Problem dabei ist, dass die Namensübereinstimmung und der Ausschluss jedes Mal wiederholt werden müssen, wenn ein Objekt serialisiert wird. Nach dem Kompilieren ändern sich die Eigenschaften eines Typs jedoch nicht. Sie sollten die Namen, die enthalten sein sollen, pro Typ vorberechnen und die Liste in jeder Zeile einfach wiederverwenden. Bei einem sehr umfangreichen JSON-Serialisierungsjob kann das Caching einen spürbaren Leistungsunterschied bewirken.
ErikE
9
Wenn Sie verwenden System.Text.Json, können Sie verwenden [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
Die Bibliothek ist als Teil des gemeinsam genutzten .NET Core 3.0-Frameworks integriert.
Installieren Sie für andere Zielframeworks das System.Text.Json NuGet-Paket. Das Paket unterstützt:
IgnoreDataMember
ScriptIgnore
JsonIgnore
abhängig von dem Serializer, den Sie verwendenAntworten:
Wenn Sie
System.Web.Script.Serialization
in .NET Framework verwenden , können SieScriptIgnore
den Mitgliedern ein Attribut zuweisen, das nicht serialisiert werden soll. Siehe das Beispiel von hier :PS. Vergessen Sie nicht, einen Verweis auf "
System.Web.Extensions
" hinzuzufügen, damit dies funktioniertquelle
ScriptIgnore
imSystem.Web.Script.Serialization
Namespace gefunden.Wenn Sie das Json.Net- Attribut verwenden,
[JsonIgnore]
wird das Feld / die Eigenschaft beim Serialisieren oder Deserialisieren einfach ignoriert.Sie können auch die Attribute DataContract und DataMember verwenden, um Eigenschaften / Felder selektiv zu serialisieren / deserialisieren.
Weitere Informationen finden Sie unter http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size
quelle
IgnoreDataMember
funktioniert nicht mit dem Standard-JsonResult
Serializer.Sie können verwenden
[ScriptIgnore]
:Referenz hier
In diesem Fall werden die ID und dann der Name nur serialisiert
quelle
[ScriptIgnore]
was soll auf dem Grundstück verwendet werden , wenn der Controller die Basis MVC - Controller verwendetreturn Json(...
?[ScriptIgnore]
in MVC Controller verwenden. Seien Sie jedoch gewarnt, wenn Sie SignalR verwenden , sollten Sie auch verwenden[JsonIgnore]
.Entschuldigung, ich habe beschlossen, eine andere Antwort zu schreiben, da keine der anderen Antworten kopierfähig genug ist.
Wenn Sie Eigenschaften nicht mit einigen Attributen dekorieren möchten oder wenn Sie keinen Zugriff auf die Klasse haben oder wenn Sie entscheiden möchten, was zur Laufzeit serialisiert werden soll, usw. usw., gehen Sie wie folgt in Newtonsoft.Json vor
Verwendung
Ich habe den Code hier veröffentlicht, falls jemand etwas hinzufügen möchte
https://github.com/jitbit/JsonIgnoreProps
WICHTIGES UPDATE: Stellen Sie sicher, dass Sie das
ContractResolver
Objekt zwischenspeichern, wenn Sie diese Antwort verwenden. Andernfalls kann die Leistung beeinträchtigt werden.quelle
Wenn Sie nicht so sehr daran interessiert sind, Code mit Attributen zu dekorieren wie ich, ist es meine Lösung, wenn Sie zum Zeitpunkt der Kompilierung nicht sagen können, was hier passieren wird.
Verwenden des Javascript Serializer
quelle
PropertyExclusionConverter
kann in eine umgewandelt werdenPropertyInclusionConverter
.Wenn Sie verwenden
System.Text.Json
, können Sie verwenden[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Offizielle Microsoft- Dokumente : JsonIgnoreAttribute
Wie hier angegeben :
quelle
Sie können das
[NonSerialized]
Attribut auch verwendenAus den MS-Dokumenten :
Wenn Sie beispielsweise Unity verwenden ( dies gilt nicht nur für Unity ), funktioniert dies mit
UnityEngine.JsonUtility
quelle