2014-04-15 37 views
0

假设我的数据库中有一个表,它将对象的类型存储为字符串,将对象的序列化数据存储为JSON。该表可以容纳许多不同的对象。是否可以将JSON对象反序列化为自定义类型,作为字符串传递?

我要重新创建的对象取决于存储的类型,像这样:

string typeFromDatabase = "SomeType"; 
string serializedData = ...some Json data here...; 

var typeToCast = ...some reflection methods here...; 

var myDeserializedObject = JsonConvert.DeserializeObject<typeToCast>(serializedData); 

是这样的可能吗?

在此先感谢。

编辑:

我想我被误解了 - 我知道,我可以用这样的:

var x = JsonConvert.DeserializeObject(sr1, typeof(SerizlizationTest1)); 

但在上述情况下,“X”至今仍是公认的“对象”和而不是“SerizlizationTest1” - 这就是我真正想要的。

现在,我想起它......我猜这是不可能的,而且很无用;]我想这就是“动态”对象的用途。

无论如何,谢谢你,对不起,没有用的问题。

此致敬礼。

+0

类型名称是否完全限定? – Jodrell

+0

是的,您的编辑确实改变了问题,并使我们的努力无效,回答了您的原始问题。我已经扩大了我的答案,以概述您的方法的“错误思维”。如果你详细说明你真正想达到的目标,我可能会提出一个更好的方法。如果你认为答案能够解决所述问题,那么没有什么可以奖励这个问题了。 – Jodrell

回答

0

是的,当然这是可能的,只要使用another overload

var myDeserizlizedObject = JsonConvert.DeserizlizeObject(serizlizedData, typeToCast); 

检索没有必要为一些“反射法”的类型,使用简单:

var typeToCast = Type.GetType(typeFromDatabase); 

确保名是完整的类型名称,如Namespace.ClassName

关于您的上次更新。你怎么可能从特定类型(我的意思是进一步使用新对象)中受益?这的确看起来像C#强类型语言荒诞:

// lets assume that var is magically becomes your typeToCast type 
var myDeserizlizedObject = JsonConvert.DeserizlizeObject<typeToCast>(serizlizedData); 

// imagine myDeserizlizedObject is a Car 
myDeserizlizedObject.StartupEngine(); 
myDeserizlizedObject.Move(); 

// but what if it's a Bag ? 
// the above code makes no sense then 

这是不是他们有一个共同的父,你可以通过铸造工艺它们一致的方式,或者它是一个switch有你按类型分别处理它们。

+0

那么,哪个重载需要两个字符串? – Jodrell

+0

@Jodrell你只是不够专心。 –

+0

好的,'typeToCast'是一个'Type',你不会显示如何从字符串typeFromDatabase'到'typeToCast'。 – Jodrell

0

请尝试下面的代码,它应该为你工作。

 
using System.Web.Script.Serialization; 

JavaScriptSerializer oJS = new JavaScriptSerializer(); 
RootObject oRootObject = new RootObject(); 
oRootObject = oJS.Deserialize(Your JSon String); 
+0

如何从'string' typeFromDatabase'构造'oRootObject'? – Jodrell

+0

请参阅我的编辑。 – user2384366

0

使用该overload

var yourObject = JsonConvert.DeserializeObject(
     serializedData, 
     Type.GetType(typeFromDatabase)); 

然而,这只会工作,如果该类型名称是装配合格。 See here


如果类型名称不是装配限定的,那么你有不同的问题。你必须做一些事情,比如遍历所有加载的程序集进行匹配。如果找不到或多个匹配项会发生什么?


在编辑之后,您似乎在问,如何将其转换为字符串中指定的类型。那么,我相信这是可能的反思,但它不会帮助你写任何有用的代码。

如果你想访问对象上的某些东西,你需要根据类型字符串“知道”它的类型,一旦你知道了,你也可以转换为该类型。事实上,你可能会首先使用DeserializeObject的另一个超载。

您可以使用dynamic盲目地盯住对象,尝试想要做的所有可能的组合并捕捉失败,但这似乎是不必要和低效的。

+0

请参阅我的编辑。 – user2384366

相关问题