JSON.net不包含null属性,EmitDefaultValue为false



我有一个包含许多数据契约的系统,其中成员使用:

[DataMember(EmitDefaultValue = false)]  

我有一个情况,我需要在序列化为JSON时包含空成员。无论我选择什么序列化器设置,我都无法使其工作。

   [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;
    }

我已经尝试了空值处理和默认值处理的所有变化,以忽略emit默认值= false。根据json . net文档,这些设置应该在我的对象上给我null属性。在我去调试json net源代码之前,还有什么我错过了吗?

您需要在契约解析器中设置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在序列化成员之前检查DefaultValueHandlingNullValueHandling,并且两个检查必须通过才能序列化成员。而且,正如你所注意到的,如果在合约的属性上显式设置了其中任何一个,那么它将覆盖JsonSerializerSettings中的设置。这就解释了为什么需要自定义契约解析器。

您可能希望缓存契约解析器以获得最佳性能。

相关内容

  • 没有找到相关文章

最新更新