Sau một chút tìm kiếm, tôi thấy câu hỏi này:
How to inherit the attribute from interface to object when serializing it using JSON.NET
Tôi mất mã bởi Jeff xương ức và thêm JsonIgnoreAttribute
phát hiện, vì vậy nó trông như thế này:
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;
}
}
Sử dụng InterfaceContractResolver
trong số JsonSerializerSettings
của tôi, tất cả các thuộc tính có JsonIgnoreAttribute
trong bất kỳ giao diện nào đều bị bỏ qua, ngay cả khi chúng có JsonPropertyAttribute
(do thứ tự của bên trong if
khối).
Bạn nên thêm câu trả lời này làm câu trả lời và chấp nhận câu trả lời nếu giải quyết được sự cố của bạn. – Groo
Tôi đã làm như vậy bây giờ, nhưng tôi không thể làm điều đó sớm hơn nhiều vì tôi không được phép làm điều đó ít hơn 8 giờ sau khi câu hỏi của tôi (và bởi vì tôi không làm việc vào cuối tuần). – fero