【发布时间】:2022-01-25 15:36:09
【问题描述】:
在我的代码中,我想使用 ShouldDeserialize 方法来使我的响应更清晰,但是对于反序列化方法,ShouldDeserialize{Property} 方法是不可见的。在下面的代码中,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 文档中记录了序列化和反序列化谓词:
【问题讨论】:
-
你也必须发布你的json。
-
ShouldDeserialize未实现 stackoverflow.com/questions/35502152/… -
@PeterCsala 它不适用于我测试的任何属性。所以我会说它不是
-
没错,检查名为 ShouldDeserializeXXX() 的属性并自动调用它从未实现过,可能是因为 XmlSerializer 只支持 ShouldSerializeXXX(),而 Json.NET 功能就是以此为模型的。见:Conditional serialization/deserialization of object properties with json.net。基础设施就在那里,所以如果需要,您可以自己做。
-
现在我查看了您的代码,您的方法
ShouldDeserializeItems()假定Items已经反序列化。 Json.NET 的ShouldDeserialize函数被称为 before 反序列化,而不是之后。您应该在反序列化后使用[OnDeserialized]回调清除不需要的项目。
标签: c# json.net asp.net-core-3.1