这是基于 this question 中代码的示例。 (尽管是为了序列化)。是否可以将所有 Required.Always
覆盖为 Required.Default
(即“可选”),并允许我反序列化对象而不考虑“必需”属性?
public class OverrideToDefaultContractResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
var contract = base.CreateObjectContract(objectType);
contract.ItemRequired = Required.Default;
return contract;
}
}
public class MyClass
{
[JsonProperty("MyRequiredProperty", Required = Required.Always, NullValueHandling = NullValueHandling.Ignore)]
public string MyRequiredProperty { get; set; }
}
public static void Test()
{
var settings = new JsonSerializerSettings { ContractResolver = new OverrideToDefaultContractResolver() };
MyClass obj = JsonConvert.DeserializeObject<MyClass>(@"{""Nope"": ""Hi there""}", settings);
Console.WriteLine($"Json property: {obj.MyRequiredProperty}");
}
最佳答案
一般来说,Json.NET 的设置优先级是:
- 应用于属性或参数的属性。
- 应用于对象的属性。
- 应用于序列化程序的序列化设置。
您的 OverrideToDefaultContractResolver
取消了在对象级别而不是在单个属性级别应用的 Required
属性。由于后者优先于前者,因此也需要取消它们。以下契约(Contract)解析器完成这项工作:
public class OverrideToDefaultContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.Required = Required.Default;
return property;
}
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
var contract = base.CreateObjectContract(objectType);
contract.ItemRequired = Required.Default;
return contract;
}
protected override JsonProperty CreatePropertyFromConstructorParameter(JsonProperty matchingMemberProperty, ParameterInfo parameterInfo)
{
var property = base.CreatePropertyFromConstructorParameter(matchingMemberProperty, parameterInfo);
property.Required = Required.Default;
return property;
}
}
注意事项:
linked answer 中的合约解析器最初旨在强制要求所有属性,除非另外明确标记 - f# 的合理默认行为,通常不允许空值。
演示 fiddle here .
关于c# - 如何覆盖 newtonsoft json 中的 "Required.Always",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63825826/