2016-09-07 137 views
0

我有一個使用JSON的C#應用​​程序。有一個錯誤,它有點複雜,所以我舉個例子。 如果我們有這個類:使用JSON對象FatherObj,在SonObj被複制的對象孫子列表反序列化時使用默認轉換器的自定義Json轉換器

public class FatherObj 
{ 
    public SonObj Son {get; set;} 
} 

public class SonObj 
{ 
    public List<GrandChildObj> GrandChildren {get; set;} 
} 

然後。我固定它加入列表的聲明之上以下代碼:

[JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)] 

然而,當我試圖將它添加到整個應用程序的JSON序列化的設置,它引起的問題。 因此,我決定製作一個只適用於List對象的JsonConverter,並且在反序列化它時將在返回之前調用Distinct方法。 但是,JsonConverter是一個抽象類,所以在實現它的方法時,您不能調用任何基本方法(因爲它們也是抽象的)。 如何調用默認轉換器設置?除了獨特之外,我不想創建其他轉換。

+0

請問'從[這個問題] CollectionClearingContractResolver'(https://stackoverflow.com/questions/35482896/clear-collections-before-adding-items-when-填充現有對象)滿足您的需求? – dbc

+0

調用「PopulateObject」的代碼中沒有地方。這仍然適用於反序列化? –

+0

它應該這樣做。你可以設置'JsonSerializerSettings.ContractResolver',然後將設置傳遞給'DeserializeObject'。請參閱http://www.newtonsoft.com/json/help/html/contractresolver.htm。但是,如果它不起作用或出現其他問題,你能分享不工作的C#代碼嗎? – dbc

回答

1

好了,有點與用戶DBC的幫助搜索後 - 我把他的答案,但是從不同的鏈接: How to apply ObjectCreationHandling.Replace to selected properties when deserializing JSON?

,他張貼在鏈接的解決方案: 創建自定義ContractResolver(從DefaultContractResolver繼承)用下面的代碼:

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
{ 
    var jsonProperty = base.CreateProperty(member, memberSerialization); 
    if (jsonProperty.ObjectCreationHandling == null && jsonProperty.PropertyType.GetListType() != null) 
     jsonProperty.ObjectCreationHandling = ObjectCreationHandling.Replace; 
    return jsonProperty; 
} 

public static class TypeExtensions 
{ 
    public static Type GetListType(this Type type) 
    { 
     while (type != null) 
     { 
      if (type.IsGenericType) 
      { 
       var genType = type.GetGenericTypeDefinition(); 
       if (genType == typeof(List<>)) 
        return type.GetGenericArguments()[0]; 
      } 
      type = type.BaseType; 
     } 
     return null; 
    } 
}