2014-09-09 12 views
9

Các tài liệu Json.NET nói bạn sử dụng JsonIgnore để không serialize tính chất nhất định trong lớp học của bạn:Làm thế nào tôi có thể yêu cầu Json.NET bỏ qua các thuộc tính trong đối tượng bên thứ 3?

public class Account 
{ 
    public string FullName { get; set; } 
    public string EmailAddress { get; set; } 

    [JsonIgnore] 
    public string PasswordHash { get; set; } 
} 

Làm thế nào tôi có thể làm cho Json.NET bỏ qua thuộc tính cụ thể khi tuần tự một đối tượng của bên thứ 3 với JsonConvert.SerializeObject?

+0

Hãy nhìn vào [IContractResolver] (http://james.newtonking.com/json/help/ index.html? topic = html/ConditionalProperties.htm) –

+0

@GuillaumeCR: Câu trả lời đã xóa của bạn là một khởi đầu tốt - chỉ cần thêm một ví dụ về mã và nó sẽ là một câu trả lời hay. –

+0

@AndrewWhitaker Tôi sẽ khi tôi nhận được một phút, nhưng bây giờ cuộc gọi công việc;) –

Trả lời

11

Thực hiện một bộ giải quyết hợp đồng tùy chỉnh:

public class ShouldSerializeContractResolver : DefaultContractResolver 
{ 
    public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver(); 


    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     JsonProperty property = base.CreateProperty(member, memberSerialization); 
     if (property.DeclaringType == typeof(Account) && property.PropertyName == "PasswordHash") 
     { 
      property.Ignored = true; 
     } 
     return property; 
    } 
} 

Làm thế nào tôi thử nghiệm nó:

 var account = new Account 
     { 
      PasswordHash = "XXAABB" 
     }; 
     var settings = new JsonSerializerSettings 
     { 
      ContractResolver = ShouldSerializeContractResolver.Instance 
     }; 
     var json = JsonConvert.SerializeObject(account, settings); 
     Console.WriteLine(json); 
+0

Tối ưu hóa nhỏ: 'nếu (! property.Ignored && property.DeclaringType == typeof (Tài khoản) && property.PropertyName == "PasswordHash") ' –

+0

Đó là tầm thường và được cho là chậm hơn vì IContractResolver được chia sẻ giữa tất cả các lớp và hầu hết các thuộc tính không bị bỏ qua, vì vậy hầu hết lần chúng ta lãng phí thời gian kiểm tra '! property.Ignored'. Hợp đồng cũng được tạo ra một cách uể oải một lần cho mỗi lớp vì vậy tôi nghĩ tốt hơn là giữ cho nó đơn giản. – tia

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