JSON.net 不包括 EmitDefaultValue 为 false 的空属性
JSON.net not including null properties with EmitDefaultValue false
我有一个包含许多数据合约的系统,其中成员装饰有:
[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 网络文档,这些设置应该为我的对象提供空属性。在我去调试 json 网络源之前,还有什么我遗漏的吗?
您需要在合同解析器中设置 property.DefaultValueHandling = DefaultValueHandling.Include
而不是 DefaultValueHandling.Ignore
:
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 检查两个 DefaultValueHandling
and NullValueHandling
before serializing a member, and both checks have to pass in order for the member to be serialized. And, as you have noticed, if either are set explicitly on the contract's property then that will override the settings in JsonSerializerSettings
。这解释了为什么需要自定义合同解析器。
您可能想要 以获得最佳性能。
我有一个包含许多数据合约的系统,其中成员装饰有:
[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 网络文档,这些设置应该为我的对象提供空属性。在我去调试 json 网络源之前,还有什么我遗漏的吗?
您需要在合同解析器中设置 property.DefaultValueHandling = DefaultValueHandling.Include
而不是 DefaultValueHandling.Ignore
:
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 检查两个 DefaultValueHandling
and NullValueHandling
before serializing a member, and both checks have to pass in order for the member to be serialized. And, as you have noticed, if either are set explicitly on the contract's property then that will override the settings in JsonSerializerSettings
。这解释了为什么需要自定义合同解析器。
您可能想要