2012-01-13 32 views
10

Tôi có một giao diện với một tài sản như thế này:Bỏ qua bất động sản quy định tại giao diện khi tuần tự sử dụng JSON.net

public interface IFoo { 
    // ... 

    [JsonIgnore] 
    string SecretProperty { get; } 

    // ... 
} 

Tôi muốn SecretProperty để được bỏ qua khi tuần tự tất cả các lớp thực hiện. Nhưng có vẻ như tôi phải xác định thuộc tính JsonIgnore về mọi hoạt động của tài sản. Có cách nào để đạt được điều này mà không cần phải thêm thuộc tính JsonIgnore vào mỗi lần triển khai không? Tôi không tìm thấy bất kỳ thiết lập serializer nào đã giúp tôi.

+0

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

+0

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

Trả lời

5

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).

1

Tôi đã tìm thấy nó đơn giản nhất để tạo DTO chỉ những thuộc tính tôi muốn và sắp xếp thứ tự đối tượng đó thành JSON. nó tạo ra nhiều đối tượng nhỏ, bối cảnh cụ thể nhưng việc quản lý cơ sở mã dễ dàng hơn nhiều và tôi không phải suy nghĩ về những gì tôi đang tuần tự hóa so với những gì tôi bỏ qua.

-1

Bạn nên thêm [DataContract] trước tên lớp.

Nó thay đổi mặc định từ bao gồm tất cả các thuộc tính, để chỉ bao gồm các thuộc tính được đánh dấu rõ ràng. Sau đó, thêm '[DataMember]' vào trước mỗi thuộc tính mà bạn muốn bao gồm trong đầu ra JSON.

+0

Đó hoàn toàn không phải những gì tôi muốn. Tôi muốn có một định nghĩa bỏ qua trong giao diện được chuyển lên trên cùng của hệ thống phân cấp lớp để trình serializer sẽ bỏ qua thuộc tính giao diện của tôi. Tôi không muốn các tài sản được serializable trong bất kỳ thực hiện của giao diện. – fero

Các vấn đề liên quan