微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#可扩展解决方案,可使用Json.Net根据用户交互来过滤属性

如何解决C#可扩展解决方案,可使用Json.Net根据用户交互来过滤属性

我正在使用C#Newtonsoft.net将数据序列化为Json。在我的程序中,我将让用户与我的部分数据进行交互,而我只希望序列化的数据成为他们与之交互的数据。

下面的代码显示了创建类A并与to属性进行交互的示例。

[DataContract]
public class B
{
  [DataMember]
  public int Property1 { get; set; } = 0;

  [DataMember]
  public int Property2 { get; set; } = 0;
}

[DataContract]
public class A
{
  [DataMember]
  public int Property1 { get; set; } = 0;

  [DataMember]
  public int Property2 { get; set; } = 0;

  [DataMember]
  public B B { get; set; } = new B();
}

public class JsonTester
{
  public void test()
  {
    var a = new A();
    a.Property1 = 1;
    a.B.Property1 = 1;

    var json = JsonConvert.SerializeObject(a,new JsonSerializerSettings()
    {
      ContractResolver = new JsonContractResolver()
    });
  }
}

我期望的json输出如下:

{
  "Property1": 1,"B": {
    "Property1": 1
  }
}

您注意到,Property2不在json中,因为我只设置了a.Property1 / a.B.Property1。

如果我的代码没有a.B.Property1 = 1,我希望json看起来像这样:

{
  "Property1": 1
}

现在,问题在于以最具可扩展性的方式执行此操作。显然,为每个属性创建单独的布尔值不是可伸缩的解决方案。

解决方法

有很多方法可以解决这个问题。

您可以使用可为空的类型,并使用NullValueHandling.Ignore枚举

序列化和反序列化对象时,请包含空值。

或者您可以使用DefaultValueHandling.Ignore

忽略成员值与成员值相同的成员 序列化对象时的默认值,以便不将其写入 JSON。此选项将忽略所有默认值(例如,对于 对象和可为空的类型; 0表示整数,小数和浮点数 点数而对于布尔值则为false)。默认值可以忽略 通过将DefaultValueAttribute放在属性上可以进行更改。

示例

public class B
{
   [DefaultValue(1)]
   public int Property1 { get; set; }
   public int Property2 { get; set; }
}

public class A
{
   [DefaultValue(1)]
   public int Property1 { get; set; } 

   public int Property2 { get; set; } 

   public B B { get; set; } = new B();
}

用法

var a = new A();
a.Property1 = 1;
a.B.Property1 = 2;

var settings = new JsonSerializerSettings()
{
   DefaultValueHandling = DefaultValueHandling.Ignore,NullValueHandling = NullValueHandling.Ignore
};

var json = JsonConvert.SerializeObject(a,Newtonsoft.Json.Formatting.Indented,settings);
Console.WriteLine(json);

输出

{
  "B": {
    "Property1": 2
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。