是否可以将JSON对象反序列化为自定义类型,作为字符串传递

本文关键字:类型 字符串 自定义 是否 JSON 对象 反序列化 | 更新日期: 2023-09-27 17:58:28

比方说,我的数据库中有一个表,它将对象的Type存储为字符串,将对象的序列化数据存储为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"仍然被识别为"Object",而不是"SerizlizationTest1"——这正是我真正想要的。

现在,我想起来……我想这是不可能的,而且非常无用;]我想这就是"动态"对象的作用。

不管怎样,还是谢谢你,很抱歉问了这个没用的问题。

致以最良好的问候。

是否可以将JSON对象反序列化为自定义类型,作为字符串传递

使用此过载,

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

但是,只有当类型名称是程序集限定的时,这才会起作用。请参见此处。


如果类型名称不是程序集限定的,则存在其他问题。您必须执行类似于遍历所有加载的程序集以查找匹配项的操作。如果找不到匹配项或多个匹配项,该怎么办?


编辑后,您似乎在问,我如何转换为字符串中命名的类型。好吧,我相信这是可能的反射,但是,它不会帮助你写任何有用的代码。

如果你想访问对象上的某个东西,你需要根据类型字符串"知道"它的类型,一旦知道了,你就可以转换为该类型。事实上,您可能会在一开始就更好地使用DeserializeObject的另一个过载。

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

试试下面的代码,它应该对你有用。

使用System。网状物剧本序列化;JavaScriptSerializer oJS=新的JavaScriptSerialier();RootObject oRootObject=新的RootObject();oRootObject=oJS。反序列化(您的JSon字符串);

是的,当然有可能,只需使用另一个重载:

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,您可以按类型单独处理它们。