C# 排除没有数据的对象

C# 排除没有数据的对象,c#,json,json.net,C#,Json,Json.net,如果对象中没有要序列化的字段/属性,如何从序列化中排除该对象 下面是一个简单的类作为示例 class Item : IComponent { [JsonProperty(PropertyName = "ID", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] public int ID = 0; } 如果我序列化一个Item对象数组,我会得到以下结果 { "Items" : [

如果对象中没有要序列化的字段/属性,如何从序列化中排除该对象

下面是一个简单的类作为示例

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 }
    ]
}
我想排除数组中的第一个item对象,因为它没有保存的数据。空的“默认”对象对于我的用例是无用的。我的用例从一个预填充的JObject开始,在反序列化时覆盖数据,所以空对象实际上是无用的

在序列化时如何排除没有定义的对象?我找不到处理此问题的
ObjectAttribute
JsonSerializerSettings
。如果需要,我可以做一个
ContractResolver

谢谢

更新:

感谢SANM2009,但是该方法的问题是您必须告诉对象是否应该序列化。但是,需要在序列化时确定是否所有内容都设置为默认值或是否存在数据集

谢谢Brian Rogers,我想我可以使用它(修改了一堆),并在我的案例中使用相同的概念

更新2:

Brian Rogers的示例工作得很好,但我不得不修改IsEmpty()方法,因为它没有考虑声明了$type的空作业对象

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));

您可能会发现中提供的
removemptychildren
方法在这里有用。我根本不希望序列化空对象。然而,也许我可以把它们过滤掉,而不是进行序列化。。。虽然我需要在每个对象上使用[OnSerialzing]来处理这个案例……但对于根本不序列化空对象,有一个特别的问题吗?(只是好奇)