C# 是否可以将JSON对象反序列化为自定义类型(作为字符串传递)?
比如说,我的数据库中有一个表,它将对象的类型存储为字符串,将对象的序列化数据存储为JSON。桌子可以容纳许多不同的对象 我想根据存储的类型重新创建对象,如下所示:C# 是否可以将JSON对象反序列化为自定义类型(作为字符串传递)?,c#,json,reflection,json.net,C#,Json,Reflection,Json.net,比如说,我的数据库中有一个表,它将对象的类型存储为字符串,将对象的序列化数据存储为JSON。桌子可以容纳许多不同的对象 我想根据存储的类型重新创建对象,如下所示: string typeFromDatabase = "SomeType"; string serializedData = ...some Json data here...; var typeToCast = ...some reflection methods here...; var myDeserializedObject
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”仍然被识别为“Object”,而不是“SerizlizationTest1”——这就是我真正想要的
现在,我想起来了。。。我想这是不可能的,而且毫无用处;]我想这就是“动态”对象的用途
无论如何,谢谢你,对于这个毫无意义的问题,我很抱歉
致以最诚挚的问候。是的,当然有可能,只要使用: 要检索类型,无需使用某些“反射方法”,请使用simple:
var typeToCast = Type.GetType(typeFromDatabase);
确保名称是完整的类型名称,如Namespace.ClassName
关于你最近的更新。拥有特定类型(我指的是新对象的进一步使用)会给您带来什么好处?在像C#这样的强类型语言中,它确实看起来很荒谬:
//让我们假设var神奇地变成了您的typeToCast类型
var myDeserizedObject=JsonConvert.DeserizedObject(serizlizedData);
//想象一下,MyDeserizedObject是一辆汽车
MyDeserizedObject.StartupEngine();
myDeserizedObject.Move();
//但是如果它是一个包呢?
//那么上面的代码就没有意义了
要么是它们有一个共同的父对象,您可以通过强制转换以统一的方式处理它们,要么是一个
开关,您可以按类型单独处理它们。尝试以下代码,它应该适合您
using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize(Your JSon String);
使用System.Web.Script.Serialization;
JavaScriptSerializer oJS=新的JavaScriptSerializer();
RootObject oRootObject=新的RootObject();
oRootObject=oJS.Deserialize(您的JSon字符串);
用这个,
但是,只有当类型名为assembly-qualified时,这才起作用
如果类型名称不是程序集限定的,则会出现另一个问题。您必须执行类似于迭代所有加载的程序集以获得匹配项的操作。如果找不到匹配项或多个匹配项,会发生什么情况
在编辑之后,您似乎在问,如何才能转换为字符串中命名的类型。嗯,我相信这在反射中是可能的,但是,它不会帮助您编写任何有用的代码
如果您想访问对象上的某些内容,则需要根据类型字符串“知道”其类型,一旦知道,您还可以强制转换为该类型。事实上,首先使用另一个重载的反序列化对象
可能会更好
您可以使用dynamic
盲目地刺穿对象,尝试您想要做的一切可能的组合,并捕捉失败,但这似乎是不必要和低效的。类型名称是否完全合格?是的,您的编辑确实会改变问题,并使我们回答原始问题的努力无效。我已经扩展了我的答案,概述了你的方法的“错误思维”。如果你详细说明你真正想要达到的目标,我可能会建议一个更好的方法。如果你觉得答案解决了上面提到的问题,那么就没有任何步骤来奖励effrot。那么,哪种重载需要两个字符串呢?@Jodrell你只是不够专心。好的,typeToCast
是一种类型
,您没有展示如何从字符串类型从数据库到类型到cast
@Jodrell哦,我假设作者已经知道如何做了,只是省略了示例代码。现在我想我错了。谢谢@用户2384366拥有特定类型(我指的是新对象的进一步使用)对您有什么好处?如何从字符串typeFromDatabase
构造oRootObject
?
// 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
using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize(Your JSon String);
var yourObject = JsonConvert.DeserializeObject(
serializedData,
Type.GetType(typeFromDatabase));