如何解决如何使 DefaultValueHandling 仅适用于某些类或成员?
我需要让对象的某些部分序列化默认值,而有些则不需要。
在下面的帖子中,我了解如何根据类型执行此操作: Json.NET: How to make DefaultValueHandling only apply to certain types?
但是这个解决方案只适用于类型,不会递归。
预期行为:
{
{
"keepDefaults" : {
"prop1" : true,"prop2" : false,},"ignoreDefaults" : {
"prop3" : true,"prop4" : false,}
}
重新序列化时:
{
"keepDefaults" : {
"prop1" : true,"prop2" : false
},"ignoreDefaults" : {
"prop3" : true
}
}
是否有我可以在 ContractProvider 中覆盖的内容或可以添加到成员或类以选择 DefaultValueHandling 的属性?
解决方法
受到@dbc 在 quoted post 中的解决方案的启发,我对其进行了修改以将 DefaultValueHandling 应用于整个类。
public class DefaultValueContractResolver : DefaultContractResolver
{
readonly Dictionary<Type,DefaultValueHandling> _overrides = new Dictionary<Type,DefaultValueHandling>();
public DefaultValueContractResolver(IEnumerable<KeyValuePair<Type,DefaultValueHandling>> overrides = null) : base()
{
_overrides = overrides?.ToDictionary(p => p.Key,p => p.Value) ?? _overrides;
}
protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member,memberSerialization);
if (property.DefaultValueHandling == null)
{
if(_overrides.TryGetValue(property.DeclaringType,out DefaultValueHandling handling))
property.DefaultValueHandling = handling;
}
return property;
}
}
然后我可以这样序列化:
var keepDefaults = new KeepDefaults
{
Prop1 = true,Prop2 = false
};
var ignoreDefaults = new IgnoreDefaults
{
Prop3 = true,Prop4 = false
};
var jsSettings = new JsonSerializerSettings
{
//DefaultValueHandling = DefaultValueHandling.Populate,ContractResolver = new DefaultValueContractResolver(
new Dictionary<Type,DefaultValueHandling>
{
{ typeof(IgnoreDefaults),DefaultValueHandling.Ignore },{ typeof(KeepDefaults),DefaultValueHandling.Populate }
}),Converters = new List<JsonConverter> { new Newtonsoft.Json.Converters.StringEnumConverter() },Formatting = Formatting.Indented
};
var json1 = JsonConvert.SerializeObject(keepDefaults,settings);
var json2 = JsonConvert.SerializeObject(ignoreDefaults,settings);
瞧,我得到了预期的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。