gpt4 book ai didi

.net - JSON.net 不包括 EmitDefaultValue 为 false 的空属性

转载 作者:行者123 更新时间:2023-12-01 15:35:26 25 4
gpt4 key购买 nike

我有一个包含许多数据合约的系统,其中成员装饰有:

[DataMember(EmitDefaultValue = false)]  

我有一个案例,当序列化为 JSON 时,我需要在 null 时包含成员。无论我选择什么序列化程序设置,我都无法让它工作。

   [TestMethod]
public void SerializationTest()
{

var contract = Activator.CreateInstance(typeof(TestContract));

var formatter = new JsonMediaTypeFormatter
{
SerializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Include,
DefaultValueHandling = DefaultValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.All,
ContractResolver = new DataContractResolver(),
Binder = new DataContractBinder()
}
};

var result = JsonConvert.SerializeObject(contract, formatter.SerializerSettings);
}

我什至创建了一个自定义数据契约解析器,它为每个属性提供额外的覆盖。

        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, MemberSerialization.Fields);
property.NullValueHandling = NullValueHandling.Include;
property.DefaultValueHandling = DefaultValueHandling.Ignore;
property.ShouldSerialize = o => true;
return property;
}

我已经尝试了空值处理和默认值处理的所有变体来忽略发出默认值 = false。根据 json net 文档,这些设置应该为我的对象提供空属性。在我去调试 json 网络源之前,还有什么我遗漏的吗?

最佳答案

您需要设置 property.DefaultValueHandling = DefaultValueHandling.Include 而不是 DefaultValueHandling.Ignore在契约(Contract)解析器中:

public class DataContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.NullValueHandling = NullValueHandling.Include;
property.DefaultValueHandling = DefaultValueHandling.Include;
property.ShouldSerialize = o => true;
return property;
}
}

Json.NET 检查 DefaultValueHandlingNullValueHandling在序列化一个成员之前,两个检查都必须通过才能序列化该成员。而且,正如您所注意到的,如果在契约(Contract)的属性上明确设置了其中一个,那么它将覆盖 JsonSerializerSettings 中的设置。 .这解释了为什么需要自定义契约(Contract)解析器。

您可能想要 cache the contract resolver以获得最佳性能。

关于.net - JSON.net 不包括 EmitDefaultValue 为 false 的空属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960844/

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