gpt4 book ai didi

c# - 使用 Json.NET 序列化时如何省略空集合

转载 作者:可可西里 更新时间:2023-11-01 08:42:54 27 4
gpt4 key购买 nike

我正在使用 Newtonsoft 的 Json.NET 7.0.0.0 将类从 C# 序列化为 JSON:

class Foo
{
public string X;
public List<string> Y = new List<string>();
}

var json =
JsonConvert.SerializeObject(
new Foo(),
Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

这里json的值是

{ "Y": [] }

但如果 Y 是一个空列表,我希望它是 { }

我找不到令人满意的方法来实现这一点。也许使用自定义契约(Contract)解析器?

最佳答案

如果您正在寻找一种可以跨不同类型通用且不需要任何修改(属性等)的解决方案,那么我认为最好的解决方案是自定义 <a href="http://www.newtonsoft.com/json/help/html/ContractResolver.htm" rel="noreferrer noopener nofollow">DefaultContractResolver</a>类(class)。它将使用反射来确定是否有 IEnumerable给定类型的 s 为空。

public class IgnoreEmptyEnumerablesResolver : DefaultContractResolver
{
public static readonly IgnoreEmptyEnumerablesResolver Instance = new IgnoreEmptyEnumerablesResolver();

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);

if (property.PropertyType != typeof(string) &&
typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
{
property.ShouldSerialize = instance =>
{
IEnumerable enumerable = null;

// this value could be in a public field or public property
switch (member.MemberType)
{
case MemberTypes.Property:
enumerable = instance
.GetType()
.GetProperty(member.Name)
.GetValue(instance, null) as IEnumerable;
break;
case MemberTypes.Field:
enumerable = instance
.GetType()
.GetField(member.Name)
.GetValue(instance) as IEnumerable;
break;
default:
break;

}

if (enumerable != null)
{
// check to see if there is at least one item in the Enumerable
return enumerable.GetEnumerator().MoveNext();
}
else
{
// if the list is null, we defer the decision to NullValueHandling
return true;
}

};
}

return property;
}
}

关于c# - 使用 Json.NET 序列化时如何省略空集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903151/

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