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>();
}
在我的代码中,我想使用 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 实现。参见: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>();
}