从类型参数中的字符串名称反序列化引用类型的JSON


var custsType = Type.GetType("Customers");          
var customers = Json.Deserialize<custsType>(data);

这显然是失败的。如何通过字符串名称引用类,以便在运行时提供它?

此外,我需要能够访问实际的强类型对象,而不是它的字符串表示。。

var custsType = Type.GetType("Customers");          
var customers = JsonConvert.DeserializeObject(data, custsType);

问题是,如果对象的类型不确定,您将很难使用该对象。假设类型名称是一个参数,否则您只需要完成

var customers = JsonConvert.DeserializeObject<Customers>(data);

这表明在编译时您不知道期望返回什么类型。问题是,如果你在编译时不知道类型,那么一旦得到对象,你就不清楚该怎么处理

如果你打算访问对象的任何属性,那么你必须事先对对象的类型有一些假设。否则,你就不会期望反序列化的对象具有该属性。

挑战不在于如何解决问题,而在于如何重新考虑方法,这样你一开始就不会遇到问题。

理想情况下,您想知道在编译时所期望的类型,它再次看起来像这样:

var customers = JsonConvert.DeserializeObject<Customers>(data, custsType);

然后,如果数据无法反序列化为预期的类型,则会引发异常,因为调用者必须传递正确的类型。

如果你发现自己处于这样一个位置:a)你不知道类型是什么,或者b)你必须使用反射来查找属性,那么就出现了问题,最好在修复之前进行备份。


试图访问这样的属性:

var name = myObject["Name"];

比反射更容易,但它最终与是一样的

var property = myObject.GetType().GetProperty("Name");
var name = property.GetValue(myObject);

在这两种情况下,你都不知道是否会有一个";名称";财产与否。任何将对象解析为JSON的方法都只是在幕后使用反射。

使用Json.Net指定类型名称处理程序:

new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
}

请参阅:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

最新更新