2013-03-02 83 views
17

我有以下問題,對此我無法解決:JSON.NET反序列化與類型參數對象

我有一個都實現一個名爲IProtocol的接口不同的類。現在命名爲SimpleProtocolParallelProtocol。我想堅持這些對象,所以我用JSON.NET,一切正常。除了當我試圖反序列化他們它完美的作品時,我知道他們都應該是類型,例如:

SimpleProtocol p = JsonConvert.DeserializeObject<SimpleProtocol>(myJsonData); 

不過,我現在在這裏我要加載的JSON數據,並獲得情況一個IProtocol回來了,但這是可以理解的,JSON不允許;例如,這樣的事情確實工作:

IProtocol p1 = JsonConvert.DeserializeObject<IProtocol>(myJsonData); // does not work 
IProtocol p2 = (IProtocol)JsonConvert.DeserializeObject(myJsonData); // also, does not work 

所以,仰視API我發現這個方法的簽名:

public static Object DeserializeObject(
    string value, 
    Type type 
) 

它看起來就像我所需要的東西,通過這樣嘗試在一個字符串也持續類型和檢索它:

// test 
Type protocolType = Type.GetType("MyApp.Protocols.SimpleProtocol"); 
IProtocol p1 = JsonConvert.DeserializeObject(myJsonData, protocolType); 

我得到一個錯誤,這是不可能投下Newtonsoft.Json.Linq.JObjectIProtocol。這很奇怪,我不知道如何解決這個問題。

無法在泛型方法中傳遞Type對象,所以我基本停留在這裏。有沒有解決這個問題的方法,最好不使用反射?它在我看來這是一個非常正常的用例。

我可以做些什麼,但對我來說似乎有點'骯髒',是創建一個簡單的包裝類,其中包含一個IProtocol實例並序列化/反序列化?

+0

你反序列化的單個元素或集合他們? – R0MANARMY 2013-03-02 19:20:07

+2

您可能想看看這些問題,看看他們是否有所幫助:[在JSON.NET中爲反序列化投射接口](http://stackoverflow.com/q/5780888/164966),[如何實現自定義JsonConverter在JSON.NET中反序列化基類對象列表](http://stackoverflow.com/q/8030538/164966),[使用Json.NET轉換器反序列化屬性](http://stackoverflow.com/q/ 164966分之2254872)。 – R0MANARMY 2013-03-02 19:26:06

+0

感謝您的提示,我已經閱讀過這些提示,但我的解決方案證明不同(請參閱下文)。 – avanwieringen 2013-03-04 08:33:39

回答

22

看來,我用這種方法最初的做法是正確的畢竟:

public static Object DeserializeObject(
    string value, 
    Type type 
) 

問題是,我堅持從

Type protocolType = Type.GetType(PersistedTypeString);下我的對象類型爲使用MyProtocol.GetType().FullName這就造成了價值

是具有null值的類型。然而,通過使用MyProtocol.GetType().AssemblyQualifiedName一切工作就好了(備註:這也包括在Type.GetType的文檔())

這裏是我的代碼示例:

Type ProtocolType = Type.GetType(MetaData["ProtocolType"]); 
var Protocol = JsonConvert.DeserializeObject(Data["Protocol"], 
              ProtocolType, 
              JsonProtocolPersister.DefaultSettings); 
return (IProtocol)Protocol;