类的自定义Json序列化

我的代码结构如下

公共类统计信息
{
公共字符串URL{get;set;}
公共字符串状态{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共整数长度{get;set;}
}

公共类UrlStats
{
公共字符串URL{get;set;}
公共int TotalPagesFound{get;set;}
public List<Stats>TotalPages{get;set;}
公共整数TotalTitleTags{get;set;}
公共列表<统计>总标题{get;set;}
public int noduplicateTileTags{get;set;}
公共列表<统计>重复标题{get;set;}
public int NoOverlengthTitleTags{get;set;}
公共列表<统计>超长标题{get;set;}
}

基本上,我正在扫描一个网站的统计数据,如标题标签,重复标题等

我正在使用JQuery,对webservice进行AJAX调用,并在运行过程中检索url统计数据,以显示迄今为止收集到的用户url统计数据,因为扫描一个大型网站需要相当长的时间。所以每5秒钟我就从服务器上检索一次统计数据。现在的问题是,当扫描处理完成时,我需要在最后发送所有列表变量数据,而不是在更新期间。现在发生了什么列表<统计数据&gt变量数据也在更新期间发送,这是一大块数据,我只想发送int类型变量,这些变量是显示流程更新所必需的

通过在互联网上搜索,我找不到任何有用的方法来解决我的问题,我发现Json.NET是一个非常好的库,但我真的不知道如何正确地使用它来获得我想要的东西

基本上,如果可能的话,我希望根据运行时的数据类型对属性进行序列化。

有两种不同的方法解决您的问题

如果要更频繁地更改类,则应该选择第一种方法,因为第一种方法可以防止您忘记序列化新添加的属性。此外,如果您想添加另一个类,并且希望以相同的方式序列化,那么它的可重用性要高得多

如果您只有这两个类,并且它们很可能不会改变,那么您可以选择第二种方法来保持解决方案的简单性

一,。使用自定义转换器选择所有int属性

第一种方法是使用自定义的JsonConverter,它通过只包含类型为int的属性来序列化类或结构。代码可能如下所示:

类IntPropertyConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
//此转换器可应用于任何类型
返回true;
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
//我们目前只支持编写JSON
抛出新的NotImplementedException();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
如果(值==null)
{
serializer.Serialize(writer,null);
回来
}
//查找类型为“int”的所有属性
var properties=value.GetType().GetProperties()。其中(p=>p.PropertyType==typeof(int));
writer.WriteStartObject();
foreach(属性中的var属性)
{
//写入属性名
writer.WritePropertyName(property.Name);
//让序列化程序序列化值本身
//(因此此转换器将与任何其他类型一起工作,而不仅仅是int)
serializer.Serialize(writer,property.GetValue(value,null));
}
writer.WriteEndObject();
}
}

然后,您必须使用jsonConverterateAttribute来装饰您的类:

[JsonConverter(typeof(IntPropertyConverter))]
公共类UrlStats
{
// ...
}

免责声明:此代码只经过了非常粗略的测试


二,。分别选择属性

第二种解决方案看起来更简单:可以使用JsonIgnoreAttribute来修饰要排除用于序列化的属性。或者,通过显式地包含要序列化的属性,可以从“黑名单”切换到“白名单”。下面是一些示例代码:

黑名单:(为了更好地了解情况,我对属性进行了重新排序)

[JsonObject(MemberSerialization.OptOut)]//这是默认值,可以省略
公共类UrlStats
{
[JsonIgnore]公共字符串URL{get;set;}
[JsonIgnore]公共列表<统计>总页面{get;set;}
[JsonIgnore]公共列表<统计>总标题{get;set;}
[JsonIgnore]公共列表<统计>重复标题{get;set;}
[JsonIgnore]公共列表<统计>超长标题{get;set;}
公共int TotalPagesFound{get;set;}
公共整数TotalTitleTags{get;set;}
public int noduplicateTileTags{get;set;}
public int NoOverlengthTitleTags{get;set;}
}

白名单:(也重新排序)

[JsonObject(MemberSerialization.OptIn)]//这很重要!
公共类UrlStats
{
公共字符串URL{get;set;}
public List<Stats>TotalPages{get;set;}
公共列表<统计>总标题{get;set;}
公共列表<统计>重复标题{get;set;}
公共列表<统计>超长标题{get;set;}
[JsonProperty]公共int TotalPagesFound{get;set;}
[JsonProperty]public int TotalTitleTags{get;set;}
[JsonProperty]public int NoDuplicateTitleTags{get;set;}
[JsonProperty]public int NoOverlengthTitleTags{get;set;}
}

发表评论