2013-03-02 79 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;