Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 有没有办法禁用DefaultValueAttributes的处理?_C#_Json.net - Fatal编程技术网

C# 有没有办法禁用DefaultValueAttributes的处理?

C# 有没有办法禁用DefaultValueAttributes的处理?,c#,json.net,C#,Json.net,我有一大堆C#类,其中很多类利用DefaultValueAttribute包含UI提示以进行编辑 我正在用Json.NET序列化这些类型的实例,并将它们发送到JavaScript客户端。为了优化带宽,我想使用DefaultValueHandling.Ignore选项,但不考虑DefaultValueAttributes。换句话说,我只想忽略技术默认值false、0、null,而不忽略开发人员定义的默认值 之所以这样做,是因为JavaScript客户端不知道开发人员定义的特殊默认值,因此它只能处理

我有一大堆C#类,其中很多类利用
DefaultValueAttribute
包含UI提示以进行编辑

我正在用
Json.NET
序列化这些类型的实例,并将它们发送到
JavaScript
客户端。为了优化带宽,我想使用
DefaultValueHandling.Ignore
选项,但不考虑
DefaultValueAttribute
s。换句话说,我只想忽略技术默认值
false、0、null
,而不忽略开发人员定义的默认值

之所以这样做,是因为
JavaScript
客户端不知道开发人员定义的特殊默认值,因此它只能处理上面提到的一般默认值


有什么方法可以关闭使用DefaultValueAttribute的功能吗?

有趣的是,Json.net使用DefaultValueAttribute-它是用于可视化设计表面,而不是序列化程序。我总是将此设置为忽略

如果要在序列化之前应用默认值,则应在反序列化之前显式设置该值;您可以在将类实例发送到序列化程序之前使用类实例上的反射来实现这一点。或者,正如这里所建议的,您可以将反射与JsonConvert结合起来,在将值写入序列化程序之前拦截该值。

您可以创建一个继承,或将属性的值重置回
默认值(T)

然后像这样使用它:

var settings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, ContractResolver = NoDefaultValueContractResolver.Instance };
var json = JsonConvert.SerializeObject(obj, settings);

通过使用自定义合约解析程序,您无需为具有
DefaultValueAttribute
某个位置的每个类型或成员创建转换器。

删除了标记,问题纯粹是C方面的问题。我不确定我是否理解问题所在。DefaultValueAttribute是为UI设计人员而设计的-它实际上没有在基础类上设置任何默认值。它不应该由JsonSerializer序列化-您可以添加生成的Json流片段,突出数据中的问题吗?谢谢,这是一个很好的解决方案。
var settings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, ContractResolver = NoDefaultValueContractResolver.Instance };
var json = JsonConvert.SerializeObject(obj, settings);