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
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...