自定义Json序列化类我的代码结构如下。publicclassStats{publicstringURL{get;放;}公共字符串状态{得到;放;}公共字符串标题{得到;放;}公共字符串描述{得到;放;}publicintLength{得到;和publicclassUrlStats{publicstringURL{get;放;}publicintTotalPagesFound{得到;放;}publicListTotalPages{get;放;}publicintTotalTitleTags{得到;放;}publicListTotalTitles{get;放;}publicintNoDuplicateTitleTags{得到;放;}publicListDuplicateTitles{get;放;}publicintNoOverlengthTitleTags{得到;放;}publicListOverlengthTitles{get;,重复标头等。我正在使用JQuery并对Web服务进行AJAX调用,并在进程运行时检索url统计信息,以显示到目前为止收集的用户url统计信息,因为扫描大型网站需要相当长的时间。因此,每隔5秒我就会从服务器检索统计信息。现在的问题是我需要在扫描处理完成时发送所有列表变量数据,而不是在更新期间发送。现在发生了什么List变量数据也在更新过程中发送,这是大块数据,我只想发送显示进度更新所需的int类型变量。通过在互联网上搜索我找不到任何有用的东西来解决我的问题,我发现Json.NET是一个非常好的库,但我真的不知道如何正确使用它来获得我想要的东西。基本上,如果可能的话,我希望在运行时根据它们的数据类型序列化属性。您的问题有两种不同的方法。如果你打算更频繁地更改类,你应该选择第一种,因为第一种方法可以防止你忘记序列化新添加的属性。此外,如果您想添加另一个要以相同方式序列化的类,它的可重用性更高。如果您只有这两个类,而且很可能它们不会改变,您可以选择第二种方法来保持您的解决方案简单。1.使用自定义转换器选择所有int属性第一种方法是使用自定义JsonConverter,它通过仅包含int类型的属性来序列化类或结构。代码可能如下所示:classIntPropertyConverter:JsonConverter{publicoverrideboolCanConvert(TypeobjectType){//这个转换器可以应用于任何类型returntrue;}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){//我们目前只支持写JSONthrownewNotImplementedException();}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){if(value==null){serializer.Serialize(writer,null);返回;}//查找类型为“int”的所有属性varproperties=value.GetType().GetProperties().Where(p=>p.PropertyType==typeof(int));writer.WriteStartObject();foreach(varpropertyinproperties){//写属性名writer.WritePropertyName(property.Name);//让序列化程序自己序列化值//(因此此转换器将适用于任何其他类型,而不仅仅是int)serializer.Serialize(writer,property.GetValue(value,无效的));}writer.WriteEndObject();然后你必须用JsonConverterAttribute装饰你的类:[JsonConverter(typeof(IntPropertyConverter))]publicclassUrlStats{//...}免责声明:这段代码只是在粗略测试之后2.单独选择属性第二种解决方案看起来更简单:可以使用JsonIgnoreAttribute修饰要排除的序列化属性。或者,您可以通过显式包含要序列化的属性从“黑名单”切换到“白名单”。下面是一些示例代码:黑名单:(为了更好地了解,我对属性进行了重新排序)放;}[JsonIgnore]publicListTotalPages{get;放;}[JsonIgnore]publicListTotalTitles{get;放;}[JsonIgnore]publicListDuplicateTitles{get;放;}[JsonIgnore]publicListOverlengthTitles{get;}publicintTotalPagesFound{得到;放;}publicintTotalTitleTags{得到;放;}publicintNoDuplicateTitleTags{得到;放;}publicintNoOverlengthTitleTags{得到;(MemberSerialization.OptIn)]//这很重要!公共类UrlStats{公共字符串URL{得到;放;}publicListTotalPages{get;放;}publicListTotalTitles{get;放;}publicListDuplicateTitles{get;放;}publicListOverlengthTitles{get;放;}[JsonProperty]publicintTotalPagesFound{get;放;}[JsonProperty]publicintTotalTitleTags{得到;放;}[JsonProperty]publicintNoDuplicateTitleTags{get;放;}[JsonProperty]publicintNoOverlengthTitleTags{get;放;哦知道了,重新阅读你的问题我认为你可以序列化你的数据投影你可以试试这个:varjson=JsonConvert.SerializeObject(new{u.TotalPagesFound,u.TotalTitleTags,u.NoDuplicateTitleTags,u.NoOverlengthTitleTags});这只会转换为JSON类的int属性。这是最简单的方法,它与您的类结构有关。如果你想要更通用的东西,你需要实现一个自定义转换器。原始答案:我认为您的类没有任何问题,您没有循环引用等奇怪的东西,因此Json.NET序列化您的类应该没有问题。所以去获取Json.NET然后你可以尝试以下//创建你的url统计类的新实例varu=newUrlStats(){URL="a.com",TotalPages=newList(){newStats(){URL="b.com",Status="xxxx"}}};//序列化!varjson=JsonConvert.SerializeObject(u);控制台.写入(json);我用这种方法得到的是:{"URL":"a.com","TotalPagesFound":0,"TotalPages":[{"URL":"b.com","Status":"xxxx",“标题”:null,“描述”:null,“长度”:0}],“TotalTitleTags”:0,“TotalTitles”:null,“NoDuplicateTitleTags”:0,“DuplicateTitles”:null,“NoOverlengthTitleTags”:0,"OverlengthTitles":null}对我来说这看起来非常好。以上就是C#学习教程:自定义Json序列化类分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
