gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:07 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com