2013-08-20 87 views
10

DefaultContractResolver.CreateProperty返回的JsonProperty類具有關於轉換器的兩個屬性,ConverterMemberConverter。我沒有找到足夠的解釋,所以他們之間有什麼區別?何時使用每一個?在合同解析器中設置什麼屬性? 「獲取或設置成員轉換器」來自official documentation沒有幫助。Json.NET的JsonProperty的轉換器和MemberConverter屬性之間的區別

+0

我在實現自定義合約解析器時遇到了模糊問題。事實證明,設置'Converter'不足以使Json.NET調用轉換器... – Athari

回答

2

看來,NS.Json支持覆蓋轉換器;大概是這樣,每個單獨的屬性不必指定一個JsonConverter,但如果需要的話,它們可能會覆蓋它。

DefaultContractResolver.cs,線路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); 

而且從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

我開了一個問題有關的文檔這裏這裏github.com/JamesNK/Newtonsoft.Json/issues/363

但是它們之間的一個明顯的區別(從源代碼中看得很清楚)是Converter僅在串行化和僅在反序列化時才使用MemberConverter。我不知道這是否是完整的故事,而且命名的確很多。

相關問題