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.
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.
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.
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(...?
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ć .
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}}
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.
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:
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.