我可以选择在运行时关闭JsonIgnore属性吗?我正在使用一组类中的Newtonsoft.Json创建一个JSON文件。创建的文件非常大,因此我为属性创建了JsonProperty以减小大小,并为某些数据类型添加了JsonIgnore和自定义格式。结果是从24MB减少到1MB,这很好;但是,我想要在运行时生成完整版本或简化属性版本的选项。无论如何我可以为序列化程序提供使用属性的选项吗?是的,这可以使用自定义ContractResolver。您没有显示任何代码,所以我只举一个例子。假设我有一个Foo类,如下所示。我想在序列化输出中使用Id和Name属性,但我绝对对AlternateName和Color不感兴趣。我用[JsonIgnore]标记了那些。我希望显示描述,但有时这会变得很长,所以我使用自定义JsonConverter来限制它的长度。我也想用一个更短的属性名来描述,所以我用[JsonProperty("Desc")]标记了它。classFoo{publicintId{get;放;}公共字符串名称{得到;放;}[JsonIgnore]publicstringAlternateName{get;放;}[JsonProperty("Desc")][JsonConverter(typeof(StringTruncatingConverter))]publicstringDescription{get;放;}[JsonIgnore]公共字符串颜色{get;放;当我序列化上面的一个实例时...Foofoo=newFoo{Id=1,Name="Thing1",AlternateName="TheFirstThing",Description="ThisissomelonglytextdescribingThing1which毫无疑问,您会发现它非常有趣和有用。",Color="Yellow"};stringjson=JsonConvert.SerializeObject(foo,Formatting.Indented);...我得到这个输出:{"Id":1,"Name":"Thing1","Desc":"ThisissomelonglytextdescribingThing1"}现在,假设我有时想获得完整的JSON输出,忽略我的定制。我可以使用自定义ContractResolver以编程方式“取消应用”类中的属性。下面是解析器代码:foreach(varpropinprops){prop.Ignored=false;//忽略[JsonIgnore]prop.Converter=null;//忽略[JsonConverter]prop.PropertyName=prop.UnderlyingName;//恢复原来的属性名}returnprops;要使用解析器,我将它添加到JsonSerializerSettings并将设置传递给序列化程序,如下所示:JsonSerializerSettingssettings=newJsonSerializerSettings();settings.ContractResolver=newIgnoreJsonAttributesResolver();settings.Formatting=Formatting.Indented;字符串json=JsonConvert.SerializeObject(foo,settings);现在包括输出忽略的属性,并且不再截断描述:{"Id":1,"Name":"Thing1","AlternateName":"TheFirstThing","Description":"Thisissomelongly描述事物1的文字,您无疑会发现它非常有趣和有用。","Color":"Yellow"}完整演示在这里:https://dotnetfiddle.net/WZpeWtJson支持我们忽略我们不想返回的属性}[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]publicstringAlternateName{get;set;}}使用方法:以上是C#学习教程:能否在运行时选择关闭JsonIgnore属性?分享全部内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——Foofoo=newFoo{Id=1,Name="Thing1",AlternateName=null,};stringjson=JsonConvert.SerializeObject(foo);本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,转载请注明出处:
