IgnoreDataMemberScriptIgnoreJsonIgnoreв зависимости от используемого вами сериализатора
LB
3
Также заслуживает внимания атрибут [NonSerialized], который применим только к полям (не к свойствам), но в остальном имеет тот же эффект, что и JsonIgnore.
Трийнко
Комментарий Трынко очень полезен .... если вы используете IgnoreDataMember для поля, ошибки не будет, но она не будет применена.
Тиллито
Ответы:
147
Если вы используете System.Web.Script.Serializationв .NET Framework, вы можете поместить ScriptIgnoreв члены атрибут, который не должен быть сериализован. Смотрите пример, взятый отсюда :
Я нашел ScriptIgnoreв System.Web.Script.Serializationпространстве имен.
Сорангвала Аббасали
355
Если вы используете атрибут Json.Net,[JsonIgnore] он просто игнорирует поле / свойство при сериализации или десериализации.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
Или вы можете использовать атрибуты DataContract и DataMember для выборочной сериализации / десериализации свойств / полей.
[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;}}
Если бы я был OP, я бы предпочел этот ответ, а не выбранное решение [ScriptIgnore]. В первую очередь из-за конгруэнтности решения Джсона, а значит и проблемы Джсона. Зачем использовать System.Web.Extensions, если используемая библиотека предоставляет решение? Абсолютно лучшим IMHO является атрибут [IgnoreDataMember], поскольку System.Runtime.Serialization должен быть совместим с каждым сериализатором, если вы хотите поменять Json.
Стив Х.
IgnoreDataMemberне работает с JsonResultсериализатором по умолчанию .
hendryanw
1
NewtonSoft просто помог мне полностью. Это сделало мой JSON выглядеть чистым без каких-либо грязных свойств из моих моделей, которые только для бэкэнда.
Сорангвала Аббасали
1
@JC Раджа Как я могу игнорировать свойство во время обессоливания, только когда это свойство имеет значение null
user123456
1
[NewtonSoft.Json] Я хочу игнорировать только сериализацию. Тогда какое-нибудь решение для этого?
URL в вашем ответе не работает. Является ли [ScriptIgnore]то , что должно быть использовано на имущество , если ваш контроллер использует базу MVC контроллер return Json(...?
Дон Чидл
2
Я знаю, что это старый комментарий, но да, используйте [ScriptIgnore]в MVC Controller. Тем не менее, будьте осторожны , если вы используете SignalR , то вы должны использовать [JsonIgnore]тоже.
Сэм
22
Извините, я решил написать еще один ответ, поскольку ни один из других ответов не является достаточно копируемым.
Если вы не хотите украшать свойства некоторыми атрибутами, или если у вас нет доступа к классу, или если вы хотите решить, что сериализовать во время выполнения и т. Д. И т. Д., Вот как вы это делаете в 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;}}
Если вы не очень заинтересованы в том, чтобы декорировать код с помощью атрибутов, как я, особенно если вы не можете сказать во время компиляции, что произойдет, вот мое решение.
Использование Сериализатора 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}}
Незначительное изменение в логике и PropertyExclusionConverterможет быть превращено в PropertyInclusionConverter.
Зарепет
это просто потрясающе
Сайкиран Мандхала
Одна потенциальная проблема, связанная с этим, заключается в том, что при каждом сериализации объекта приходится выполнять работу по сопоставлению имен и исключению снова и снова. Однако после компиляции свойства типа не изменятся - вы должны предварительно рассчитать для каждого типа имена, которые должны быть включены, и просто повторно использовать список в каждой строке. Для очень масштабной работы по сериализации JSON кэширование может существенно повлиять на производительность.
ErikE
9
Если вы используете, System.Text.Jsonто вы можете использовать [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
IgnoreDataMember
ScriptIgnore
JsonIgnore
в зависимости от используемого вами сериализатораОтветы:
Если вы используете
System.Web.Script.Serialization
в .NET Framework, вы можете поместитьScriptIgnore
в члены атрибут, который не должен быть сериализован. Смотрите пример, взятый отсюда :PS. Не забудьте добавить ссылку на "
System.Web.Extensions
", чтобы это работалоисточник
ScriptIgnore
вSystem.Web.Script.Serialization
пространстве имен.Если вы используете атрибут Json.Net,
[JsonIgnore]
он просто игнорирует поле / свойство при сериализации или десериализации.Или вы можете использовать атрибуты DataContract и DataMember для выборочной сериализации / десериализации свойств / полей.
См. Http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reduc-serialized-json-size для получения дополнительной информации.
источник
IgnoreDataMember
не работает сJsonResult
сериализатором по умолчанию .Вы можете использовать
[ScriptIgnore]
:Ссылка здесь
В этом случае идентификатор и имя будут только сериализованы
источник
[ScriptIgnore]
то , что должно быть использовано на имущество , если ваш контроллер использует базу MVC контроллерreturn Json(...
?[ScriptIgnore]
в MVC Controller. Тем не менее, будьте осторожны , если вы используете SignalR , то вы должны использовать[JsonIgnore]
тоже.Извините, я решил написать еще один ответ, поскольку ни один из других ответов не является достаточно копируемым.
Если вы не хотите украшать свойства некоторыми атрибутами, или если у вас нет доступа к классу, или если вы хотите решить, что сериализовать во время выполнения и т. Д. И т. Д., Вот как вы это делаете в Newtonsoft.Json
использование
Я опубликовал здесь код на случай, если кто-то захочет что-нибудь добавить
https://github.com/jitbit/JsonIgnoreProps
ВАЖНОЕ ОБНОВЛЕНИЕ: убедитесь, что вы кэшируете
ContractResolver
объект, если решите использовать этот ответ, иначе производительность может снизиться.источник
Если вы не очень заинтересованы в том, чтобы декорировать код с помощью атрибутов, как я, особенно если вы не можете сказать во время компиляции, что произойдет, вот мое решение.
Использование Сериализатора Javascript
источник
PropertyExclusionConverter
может быть превращено вPropertyInclusionConverter
.Если вы используете,
System.Text.Json
то вы можете использовать[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Официальные документы Microsoft: JsonIgnoreAttribute
Как указано здесь :
источник
Вы также можете использовать
[NonSerialized]
атрибутИз документов MS :
Если вы используете Unity, например ( это не только для Unity ), то это работает с
UnityEngine.JsonUtility
источник