【问题标题】:DataMemberAttribute.IsRequired is used even though NullValueHandling is IgnoreDataMemberAttribute.IsRequired 被使用,即使 NullValueHandling 是 Ignore
【发布时间】:2014-04-22 03:56:44
【问题描述】:

我遇到了一个问题,我正在使用的依赖项已设置

[DataMemberAttribute(IsRequired = true)]

但它并没有将它的值从一个点发送到另一个点。

这对他们有用,因为他们使用的是ServiceStack.Text,而不关心DataMemberAttribute

但我使用的是 Json.net,它会检查此属性并随后失败。

(我正在谈论的依赖项的支持已经承认他们在按要求设置它时出错了。总有一天会修复。但等待的时间太长了。)

如果我创建一个新的序列化程序设置,例如:

new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };

DefaultContractResolver.cs中的方法SetPropertySettingsFromAttributes()中属性仍然设置为Required.AllowNull

从不会在该方法中检查序列化程序设置,也不会在引发此问题的JsonSerializerInternalReader.EndObject() 中检查:

“在 JSON 中找不到必需的属性 '...'。”

所以:

  • 这是 Json.net 中的错误吗?那就是不遵守序列化程序设置?
  • 有什么方法可以在不修改源代码的情况下改变这种行为?

提前谢谢你!

【问题讨论】:

    标签: json.net


    【解决方案1】:

    我通过覆盖DefaultContractResolverCreateProperty 方法解决了这个问题,并编写了如下代码:

    protected override JsonProperty CreateProperty(MemberInfo m, MemberSerialization s)
    {
        var property = base.CreateProperty(m, s);
        property.Required = Required.Default;
        return property;
    }
    

    不是最优雅的解决方案......但它有效,并且允许我忽略任何和所有必需的检查。这可能不是最佳解决方案,但足以满足我的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 2020-05-31
      • 2018-05-27
      相关资源
      最近更新 更多