newtonsoft.json ShouldSerialize 属性 工作但 ShouldDeserialize 不工作

newtonsoft.json ShouldSerialize property working but ShouldDeserialize not working

在我的代码中,我想使用 ShouldDeserialize 方法使我的响应更清晰,但是 ShouldDeserialize{属性} 方法对于反序列化方法不可见。在下面的代码中 ShouldSerializeItems 谓词有效。

public class ItemsContainer
{
    public string Id { get; set; }

    [JsonProperty]
    public IEnumerable<Item> Items{ get; set; }
    //Working
    public bool ShouldSerializeItems()
    {
        return !Items.All(x =>
            string.IsNullOrEmpty(x.ItemName) && string.IsNullOrEmpty(x.ItemId));
    }
    // Not working
    public bool ShouldDeserializeItems()
    {
        return !Items.All(x =>
            string.IsNullOrEmpty(x.ItemName) && string.IsNullOrEmpty(x.ItemId));
    }
}

并调用反序列化:

JsonConvert.DeserializeObject<ItemsContainer>(json);

在 newtonsoft 文档中记录了序列化和反序列化谓词:

但是当您要反序列化 ItemContainer 的 Items 属性 时,Items 属性 中可能还没有任何内容。您可能不需要此谓词,因为如果 ShouldSerialize 正常工作,您将永远不会有垃圾数据进行反序列化。

检查名为 ShouldDeserialize*() 的 属性 并自动调用它从未被 Json.NET 实现。参见:. The infrastructure is there, so you could do it yourself by implementing a custom contract resolver that overrides DefaultContractResolver.CreateProperty() and sets JsonProperty.ShouldDeserialize.

也就是说,您的方法 ShouldDeserializeItems() 似乎假定 Items 已经被反序列化,然后根据一些自定义逻辑将它们过滤掉。 Json.NET 的 JsonProperty.ShouldDeserialize 谓词在 反序列化之前被调用,而不是在反序列化之后。当它 returns true JSON 属性 被 跳过 时无法检查内容,因此不能在这里使用。

相反,您应该使用 [OnDeserialized] 回调在反序列化后清除不需要的项目:

[System.Runtime.Serialization.OnDeserialized]
private void OnDeserializedMethod(System.Runtime.Serialization.StreamingContext context)
{       
    if (Items != null && Items.All(x =>
        string.IsNullOrEmpty(x.ItemName) && string.IsNullOrEmpty(x.ItemId)))
        Items = new List<Item>();
}