2016-01-14 62 views
1

使用JSON.net,我想反序列化從抽象類繼承的類型列表。我已經使用KnownTypesBindersource)像使用JSON.net Binder/TypeNameHandling嵌套類型

var jsonSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.TypeNameHandling = TypeNameHandling.Auto; 
jsonSettings.Binder = new KnownTypesBinder { KnownTypes = new List<Type> { ... } }; 

現在,這部作品在WEB API ModelBinder的完美的罰款;KnownTypesBinder.BindToType被稱爲一個對象可以反序列化。在Web應用程序的不同部分,我必須反序列化JSON字符串,所以我想重新使用相同的JsonFormatter。根據文件,以下應該工作;

JsonConvert.DeserializeObject<T>(String, JsonSerializerSettings); 

然而,當我做到這一點:

JsonConvert.DeserializeObject<A>(jsonString, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings); 

以下錯誤被拋出:

JsonSerializationException。無法創建類型C的實例。類型是接口或抽象類,無法實例化。

我的類型看起來像這樣;

class A { 
    public B B { get; set; } 
} 

class B { 
    public List<C> C { get; set; } 
} 

abstract class C { } 

class C1: C { } 
class C2: C { } 

另外創建一個新的JsonSerializerSettings和設置BinderTypeNameHandling沒什麼區別。我發現KnownTypesBinder.BindToType根本沒有被調用。 JSON.net中是否有我缺少的東西?

回答

0

這裏感覺很蠢。 JSON.net使用的鑑別器被稱爲"$type"。由於我使用curl發送POST有效負載,bash試圖將$type解析爲環境變量。由於沒有這樣的變量,最終的JSON只是{"": "C"}而不是{"$type": "C"}