Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以将JSON对象反序列化为自定义类型(作为字符串传递)?_C#_Json_Reflection_Json.net - Fatal编程技术网

C# 是否可以将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

比如说,我的数据库中有一个表,它将对象的类型存储为字符串,将对象的序列化数据存储为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”——这就是我真正想要的

现在,我想起来了。。。我想这是不可能的,而且毫无用处;]我想这就是“动态”对象的用途

无论如何,谢谢你,对于这个毫无意义的问题,我很抱歉


致以最诚挚的问候。

是的,当然有可能,只要使用:

要检索类型,无需使用某些“反射方法”,请使用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));