c# - 如何覆盖 newtonsoft json 中的 "Required.Always"

标签 c# json json.net

这是基于 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 的设置优先级是:

  1. 应用于属性或参数的属性。
  2. 应用于对象的属性。
  3. 应用于序列化程序的序列化设置。

您的 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;
    }
}

注意事项:

演示 fiddle here .

关于c# - 如何覆盖 newtonsoft json 中的 "Required.Always",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63825826/

相关文章:

c# - 生成服务器中的 Microsoft.Office.Interop.Excel 引用

c# - Null 合并运算符为动态对象的属性返回 null

javascript - 将 Ruby JSON 变量传递给 javascript 变量

java - REST Web 服务 POST 方法 header 和表单参数

c# - JObject 错误 "Property with the same name already exists on object"

c# - 将对象数组序列化为 JSON

c# - .NET 应用仅在 Release模式下挂起,有时 ... :-(

c# - 使用 C#/WPF 显示缩略图网格

c# - C# 中动态类型的限制

php - 将Mysql结果集转换为JSON会打印相同字段两次