IgnoreDataMemberScriptIgnoreJsonIgnorew zależności od używanego serializatora
LB
3
na uwagę zasługuje również atrybut [NonSerialized], który ma zastosowanie tylko do pól (nie właściwości), ale poza tym ma taki sam efekt jak JsonIgnore.
Triynko
Komentarz Trynko jest bardzo przydatny .... jeśli użyjesz IgnoreDataMember na polu, nie będzie błędu, ale nie zostanie zastosowany.
Tillito,
Odpowiedzi:
147
Jeśli używasz System.Web.Script.Serializationw środowisku .NET , możesz nadać ScriptIgnoreczłonkom atrybut, którego nie należy szeregować. Zobacz przykład wzięty stąd :
Jeśli używasz atrybutu Json.Net[JsonIgnore] , po prostu zignorujesz pole / właściwość podczas serializacji lub deserializacji.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
Lub możesz użyć atrybutu DataContract i DataMember do selektywnej serializacji / deserializacji właściwości / pól.
[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;}}
Gdybym był OP, wolałbym tę odpowiedź niż wybrane rozwiązanie [ScriptIgnore]. Przede wszystkim ze względu na zgodność rozwiązania Json z problemem Json. Po co angażować System.Web.Extensions, gdy używana biblioteka zapewnia rozwiązanie? Absolutnie najlepszym IMHO jest atrybut [IgnoreDataMember], ponieważ System.Runtime.Serialization powinien być kompatybilny z każdym serializatorem, jeśli chcesz zamienić Jsona.
Steve H.
IgnoreDataMembernie działa z domyślnym JsonResultserializatorem.
hendryanw,
1
NewtonSoft pomógł mi w pełni. To sprawiło, że mój json wyglądał czysto, bez żadnych nieporządnych właściwości z moich modeli, które są tylko dla backendu.
Sorangwala Abbasali
1
@JC Raja Jak mogę zignorować właściwość podczas odsalania tylko wtedy, gdy ta właściwość jest pusta
24.04.17
1
[NewtonSoft.Json] Chcę zignorować tylko serializację. Jakieś rozwiązanie tego problemu?
Adres URL w odpowiedzi jest uszkodzony. Czy [ScriptIgnore]należy korzystać z właściwości, jeśli kontroler korzysta z podstawowego kontrolera MVC return Json(...?
Don Cheadle
2
Wiem, że to stary komentarz, ale tak, użyj [ScriptIgnore]w MVC Controller. Pamiętaj jednak, że jeśli używasz SignalR , powinieneś [JsonIgnore]również użyć .
Sam
21
Przepraszamy, postanowiłem napisać inną odpowiedź, ponieważ żadnej z pozostałych odpowiedzi nie można wystarczająco wkleić.
Jeśli nie chcesz dekorować właściwości za pomocą niektórych atrybutów lub jeśli nie masz dostępu do klasy, lub jeśli chcesz zdecydować, co do serializacji w czasie wykonywania itp. Itp., Oto jak to zrobić w 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;}}
WAŻNA AKTUALIZACJA: upewnij się, że buforujesz ContractResolverobiekt, jeśli zdecydujesz się użyć tej odpowiedzi, w przeciwnym razie może to pogorszyć wydajność.
Jeśli nie lubisz dekorować kodu atrybutami tak, jak ja, szczególnie gdy nie możesz powiedzieć w czasie kompilacji, co się tutaj stanie, to moje rozwiązanie.
Korzystanie z Serializatora 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}}
Niewielka zmiana w logice i PropertyExclusionConvertermoże być przekształcona w PropertyInclusionConverter.
Zarepheth,
to jest po prostu niesamowite
SaiKiran Mandhala,
Jednym z potencjalnych problemów jest to, że musi on ciągle dopasowywać nazwy i wykluczać za każdym razem, gdy obiekt jest szeregowany. Jednak po skompilowaniu właściwości typu nie zmienią się - należy wstępnie obliczyć dla każdego typu nazwy, które należy uwzględnić, i po prostu ponownie użyć listy w każdym wierszu. W przypadku bardzo masowego zadania serializacji JSON buforowanie może mieć zauważalną różnicę w wydajności.
ErikE
9
Jeśli używasz System.Text.Json, możesz użyć [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
Biblioteka jest wbudowana jako część wspólnego środowiska .NET Core 3.0.
W przypadku innych platform docelowych zainstaluj pakiet System.Text.Json NuGet. Pakiet obsługuje:
IgnoreDataMember
ScriptIgnore
JsonIgnore
w zależności od używanego serializatoraOdpowiedzi:
Jeśli używasz
System.Web.Script.Serialization
w środowisku .NET , możesz nadaćScriptIgnore
członkom atrybut, którego nie należy szeregować. Zobacz przykład wzięty stąd :PS. Nie zapomnij dodać odniesienia do „
System.Web.Extensions
”, aby to zadziałałoźródło
ScriptIgnore
wSystem.Web.Script.Serialization
przestrzeni nazw.Jeśli używasz atrybutu Json.Net
[JsonIgnore]
, po prostu zignorujesz pole / właściwość podczas serializacji lub deserializacji.Lub możesz użyć atrybutu DataContract i DataMember do selektywnej serializacji / deserializacji właściwości / pól.
Patrz http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size więcej szczegółów
źródło
IgnoreDataMember
nie działa z domyślnymJsonResult
serializatorem.Możesz użyć
[ScriptIgnore]
:Odnośnik tutaj
W takim przypadku identyfikator, a następnie nazwa będą tylko serializowane
źródło
[ScriptIgnore]
należy korzystać z właściwości, jeśli kontroler korzysta z podstawowego kontrolera MVCreturn Json(...
?[ScriptIgnore]
w MVC Controller. Pamiętaj jednak, że jeśli używasz SignalR , powinieneś[JsonIgnore]
również użyć .Przepraszamy, postanowiłem napisać inną odpowiedź, ponieważ żadnej z pozostałych odpowiedzi nie można wystarczająco wkleić.
Jeśli nie chcesz dekorować właściwości za pomocą niektórych atrybutów lub jeśli nie masz dostępu do klasy, lub jeśli chcesz zdecydować, co do serializacji w czasie wykonywania itp. Itp., Oto jak to zrobić w Newtonsoft.Json
Stosowanie
Opublikowałem tutaj kod na wypadek, gdyby ktoś chciał coś dodać
https://github.com/jitbit/JsonIgnoreProps
WAŻNA AKTUALIZACJA: upewnij się, że buforujesz
ContractResolver
obiekt, jeśli zdecydujesz się użyć tej odpowiedzi, w przeciwnym razie może to pogorszyć wydajność.źródło
Jeśli nie lubisz dekorować kodu atrybutami tak, jak ja, szczególnie gdy nie możesz powiedzieć w czasie kompilacji, co się tutaj stanie, to moje rozwiązanie.
Korzystanie z Serializatora Javascript
źródło
PropertyExclusionConverter
może być przekształcona wPropertyInclusionConverter
.Jeśli używasz
System.Text.Json
, możesz użyć[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Oficjalne dokumenty Microsoft: JsonIgnoreAttribute
Jak stwierdzono tutaj :
źródło
Możesz także użyć
[NonSerialized]
atrybutuZ dokumentów MS :
Jeśli używasz na przykład Unity ( nie dotyczy to tylko Unity ), to działa z
UnityEngine.JsonUtility
źródło