2013-08-20 12 views
10

Lớp JsonProperty được trả về bởi DefaultContractResolver.CreateProperty có hai thuộc tính về bộ chuyển đổi, ConverterMemberConverter. Tôi không tìm thấy đủ lời giải thích về họ, vậy sự khác biệt giữa chúng là gì? Khi nào thì sử dụng mỗi cái? Tài sản nào được đặt trong trình giải quyết hợp đồng? "Gets hoặc đặt bộ chuyển đổi thành viên" từ official documentation không hữu ích.Sự khác biệt giữa các thuộc tính Converter và MemberConverter của JsonPro's JsonProperty

+0

Tôi đã gặp sự cố về sự mơ hồ khi triển khai giải pháp hợp đồng tùy chỉnh. Nó bật ra rằng thiết lập 'Converter' là không đủ để làm cho Json.NET gọi bộ chuyển đổi ... – Athari

Trả lời

2

Dường như NS.Json hỗ trợ các trình chuyển đổi có thể ghi đè; có lẽ điều này là để mỗi tài sản cá nhân không phải chỉ định một JsonConverter, nhưng họ có thể ghi đè lên nó nếu cần thiết.

gợi ý có thể được tìm thấy trong các nguồn:

Từ DefaultContractResolver.cs, dòng 1254:

private void SetPropertySettingsFromAttributes(JsonProperty property, object attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess) 
{ 
    ... 
    // resolve converter for property 
    // the class type might have a converter but the property converter takes presidence 
    property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider); 
    property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider); 

Và từ JsonSerializerInternalReader.cs, line 348:

private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty) 
    { 
     JsonConverter converter = null; 
     if (memberConverter != null) 
     { 
      // member attribute converter 
      converter = memberConverter; 
     } 
     else if (containerProperty != null && containerProperty.ItemConverter != null) 
     { 
      converter = containerProperty.ItemConverter; 
     } 
     else if (containerContract != null && containerContract.ItemConverter != null) 
     { 
      converter = containerContract.ItemConverter; 
     } 
     else if (contract != null) 
     { 
      JsonConverter matchingConverter; 
      if (contract.Converter != null) 
       // class attribute converter 
       converter = contract.Converter; 
      else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null) 
       // passed in converters 
       converter = matchingConverter; 
      else if (contract.InternalConverter != null) 
       // internally specified converter 
       converter = contract.InternalConverter; 
     } 
     return converter; 
    } 
2

tôi đã mở một vấn đề về các tài liệu trên điều này ở đây github.com/JamesNK/Newtonsoft.Json/issues/363.

Nhưng một sự khác biệt rõ ràng giữa chúng (hiển nhiên từ mã nguồn), đó là chuyển đổi chỉ được sử dụng khi tuần tự hóa và biến thành viên chỉ khi deserializing. Tôi không biết nếu đó là câu chuyện đầy đủ mặc dù, và đặt tên không nói nhiều.