Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类中ShouldSerialize()的重构。。。我可以使用IContractResolver吗?_C#_Api_Serialization_Json.net - Fatal编程技术网

C# 类中ShouldSerialize()的重构。。。我可以使用IContractResolver吗?

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

我有一个API,返回一个汽车功能的大列表。。。。都是布尔或整数。。。基本上,我只想显示那些返回真值或整数大于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
属性,似乎可以将
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;