gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:49:57 26 4
gpt4 key购买 nike

这是基于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com