类中ShouldSerialize()的Refactor..我可以使用IContractResolver吗

本文关键字:可以使 IContractResolver 我可以 Refactor ShouldSerialize 类中 | 更新日期: 2023-09-27 18:11:43

我有一个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()的Refactor..我可以使用IContractResolver吗

听起来,您试图通过编写所有这些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;
相关文章: