如何解决C#可扩展解决方案,可使用Json.Net根据用户交互来过滤属性
我正在使用C#Newtonsoft.net将数据序列化为Json。在我的程序中,我将让用户与我的部分数据进行交互,而我只希望序列化的数据成为他们与之交互的数据。
[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 举报,一经查实,本站将立刻删除。