gpt4 book ai didi

c# - 使用 JSON.net 序列化时忽略接口(interface)中定义的属性

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

我有一个具有如下属性的接口(interface):

public interface IFoo {
// ...

[JsonIgnore]
string SecretProperty { get; }

// ...
}

我希望在序列化所有实现类时忽略 SecretProperty。但似乎我必须在属性的每个实现上定义 JsonIgnore 属性。有没有一种方法可以实现这一点而不必向每个实现添加 JsonIgnore 属性?我没有找到任何对我有帮助的序列化程序设置。

最佳答案

经过一番搜索,我发现了这个问题:

How to inherit the attribute from interface to object when serializing it using JSON.NET

我拿了 Jeff Sternal 的代码并添加了 JsonIgnoreAttribute 检测,所以它看起来像这样:

class InterfaceContractResolver : DefaultContractResolver
{
public InterfaceContractResolver() : this(false) { }

public InterfaceContractResolver(bool shareCache) : base(shareCache) { }

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
var interfaces = member.DeclaringType.GetInterfaces();
foreach (var @interface in interfaces)
{
foreach (var interfaceProperty in @interface.GetProperties())
{
// This is weak: among other things, an implementation
// may be deliberately hiding an interface member
if (interfaceProperty.Name == member.Name && interfaceProperty.MemberType == member.MemberType)
{
if (interfaceProperty.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Any())
{
property.Ignored = true;
return property;
}

if (interfaceProperty.GetCustomAttributes(typeof(JsonPropertyAttribute), true).Any())
{
property.Ignored = false;
return property;
}
}
}
}

return property;
}
}

在我的 JsonSerializerSettings 中使用此 InterfaceContractResolver,在任何接口(interface)中具有 JsonIgnoreAttribute 的所有属性也将被忽略,即使它们具有JsonPropertyAttribute(由于内部 if block 的顺序)。

关于c# - 使用 JSON.net 序列化时忽略接口(interface)中定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8849613/

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