首页 > 解决方案 > Newtonsoft Json.NET 不序列化 [过时] 属性

问题描述

有没有办法将 Json.NET 配置为不序列化具有属性的[Obsolete]属性?

例如

public class Foo
{
    public int Id { get; set; }

    [Obsolete]
    public int Age { get; set; }
 }

 var foo = new Foo { Id = 123, Age = 23 };
 var json = JsonConvert.SerializeObject(foo);

在上面的例子中,json是{"Id":123,"Age":23}

我想{"Id":123}

标签: c#json.net

解决方案


是的,您可以使用自定义ContractResolver排除标记为过时的属性。
这是解析器所需的代码:

public class ExcludeObsoletePropertiesResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member, memberSerialization);
        if (prop.AttributeProvider.GetAttributes(true).OfType<ObsoleteAttribute>().Any())
        {
            prop.ShouldSerialize = obj => false;
        }
        return prop;
    }
}

然后像这样使用它:

var settings = new JsonSerializerSettings
{
    ContractResolver = new ExcludeObsoletePropertiesResolver()
};
var json = JsonConvert.SerializeObject(foo, settings);

在这里工作演示:https ://dotnetfiddle.net/gIRCD4


推荐阅读