如何从序列化中排除对象中没有被序列化的字段/属性的对象。
下面以一个简单的类为例。
class Item : IComponent
{
[JsonProperty(PropertyName = "ID", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
public int ID = 0;
}
如果我序列化一个 Item 对象数组,我会得到以下结果。
{
"Items" : [
{ "$type": "Item" },
{ "$type": "Item", "ID": 1},
{ "$type": "Item", "ID": 2 }
]
}
我想排除数组中的第一个项目对象,因为它没有保存数据。空的“默认”对象对我的用例没有用。我的用例以预填充的 JObject 开始,并在反序列化时覆盖数据,因此空对象实际上是无用的。
有什么想法可以在序列化时排除其中没有定义的对象吗?我找不到处理此问题的 ObjectAttribute
或 JsonSerializerSettings
。如果需要,我可以使用 ContractResolver
。
谢谢。
更新:
感谢 SANM2009,但该方法的问题是您必须告诉对象它是否应该序列化。但是,如果一切都设置为默认值或是否存在数据集,则需要在序列化时确定。
谢谢 Brian Rogers,我想我可以使用它(修改了一堆)并使相同的概念适用于我的情况。
更新 2:
Brian Rogers 示例运行良好,但我必须修改 IsEmpty() 方法,因为它没有考虑声明了 $type 的空 JObjects。
public static bool IsEmpty(JToken token)
{
return (token.Type == JTokenType.Null) ||
(token.Type == JTokenType.Array && !token.HasValues) ||
(token.Type == JTokenType.Object && !token.HasValues) ||
(token.Type == JTokenType.Object && token.Count() == 1 && token["$type"] != null);
}
谢谢大家。我希望有一些更简单的设置,比如 Json.net 中的设置,但是哦,好吧。
最佳答案
对象序列化后过滤不是更好吗?
Items.Where(t => t.GetType().GetProperty("ID")!=null));
关于c# - 排除没有数据的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48796768/