C# 类中ShouldSerialize()的重构。。。我可以使用IContractResolver吗?
我有一个API,返回一个汽车功能的大列表。。。。都是布尔或整数。。。基本上,我只想显示那些返回真值或整数大于0的值 我使用的是JSON.net,因此我使用ShouldSerialize()属性来确定是否应该根据属性的值序列化该属性,我的代码如下所示:C# 类中ShouldSerialize()的重构。。。我可以使用IContractResolver吗?,c#,api,serialization,json.net,C#,Api,Serialization,Json.net,我有一个API,返回一个汽车功能的大列表。。。。都是布尔或整数。。。基本上,我只想显示那些返回真值或整数大于0的值 我使用的是JSON.net,因此我使用ShouldSerialize()属性来确定是否应该根据属性的值序列化该属性,我的代码如下所示: public class Features { public bool ABS { get; set; } public bool ShouldSerializeABS() { // don't seria
public class Features
{
public bool ABS { get; set; }
public bool ShouldSerializeABS()
{
// don't serialize the ABS property if ABS is false
return (ABS != false);
}
public bool Immobiliser { get; set; }
public bool ShouldSerializeImmobiliser ()
{
// don't serialize the Immobiliser property if Immobiliser is false
return (Immobiliser != false);
}
public int BHP { get; set; }
public bool ShouldSerializeBHP ()
{
// don't serialize the BHP property if BHP is false
return (BHP != 0);
}
//..... etc
}
这非常有效,并提供了我想要的结果,但是我只是想知道是否有办法重新考虑这一点,这样我的类就不会被所有ShouldSerialize()属性弄得乱七八糟了
我一直在研究启用了IContractResolver
的CopyConditional
属性,似乎可以将IContractResolver
用于此目的,但我似乎仍然得到了大量似乎无法重新分解的代码
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(Features) && property.PropertyName == "ABS")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.ABS != false;
};
}
if (property.DeclaringType == typeof(Features) && property.PropertyName == "Immobiliser")
{
property.ShouldSerialize =
instance =>
{
Features e = (Features)instance;
return e.Immobiliser != false;
};
}
return property;
}
}
如果属性为false,则使用ShouldSerializeContractResolver的此方法似乎不会从类中删除该属性。。。非常感谢您提供的任何帮助这听起来像是您试图通过编写所有这些ShouldSerialize()方法来完成的,只需将序列化程序上的
DefaultValueHandling
设置更改为忽略即可。这将导致不序列化任何等于其默认值的值(bool为false,int为0)
JsonSerializerSettings jsonSettings = new JsonSerializerSettings();
jsonSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
string json = JsonConvert.SerializeObject(yourObject, jsonSettings);
如果您使用的是Web API,那么您可以通过WebApiConfig
类(在App\u Start文件夹中)的Register
方法访问Json.NET序列化程序的设置
JsonSerializerSettings settings = config.Formatters.JsonFormatter.SerializerSettings;
settings.DefaultValueHandling = DefaultValueHandling.Ignore;