我有一个API,它返回了一大串汽车功能。。。。所有的都是bool或int。。。基本上我只想显示那些返回真值或大于0的整数。
我使用的是JSON.net,因此我可以使用ShouldSerialize((属性来确定是否应该根据其值序列化该属性,并且我的代码如下所示:
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
属性http://james.newtonking.com/projects/json/help/index.html?topic=html/ConditionalProperties.htm并且看起来可以使用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
设置更改为Ignore即可完成。这将导致任何等于其默认值的值(对于bool为false,对于int为0(都不会被序列化。
JsonSerializerSettings jsonSettings = new JsonSerializerSettings();
jsonSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
string json = JsonConvert.SerializeObject(yourObject, jsonSettings);
如果使用Web API,则可以通过WebApiConfig
类的Register
方法(在App_Start文件夹中(访问Json.NET序列化程序的设置。
JsonSerializerSettings settings = config.Formatters.JsonFormatter.SerializerSettings;
settings.DefaultValueHandling = DefaultValueHandling.Ignore;