c# - 排除没有数据的对象

标签 c# json json.net

如何从序列化中排除对象中没有被序列化的字段/属性的对象。

下面以一个简单的类为例。

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 开始,并在反序列化时覆盖数据,因此空对象实际上是无用的。

有什么想法可以在序列化时排除其中没有定义的对象吗?我找不到处理此问题的 ObjectAttributeJsonSerializerSettings。如果需要,我可以使用 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/

相关文章:

javascript - 使用 ng-options 仅选择 JSON 对象的属性名称

java - Java 和 MongoDB 集成中从 JSON 中读取所需字段,该 JSON 既不是 JSONobject,也不是 JSONArray

javascript - 在这种情况下我可以使用 JS 变量吗?如何使用?

c# - 如何将 JSON 包装的集合属性反序列化为泛型类?

c# - 如何合并两个 JObject?

c# - 无法使用 Json.net 序列化具有复杂键的字典

c# - PartialView 方法返回 Null(似乎根本没有调用 View )

c# - 如何使用mysql减少存储过程的执行时间

c# - 从 HTTP 请求接收 JSON 数据

c# - 使用属性进行反射优化。