反序列化 JSON 个对象:使用哪一个?
Deserializing JSON objects: which one to use?
我意识到有两种方法可以将 JSON 反序列化为一个对象。
所以假设我有一个包含 JSON 数据的字符串 json
、一个名为 Name
的类型和一个名为 ser
:
的 JavaScriptSerializer
JavaScriptSerializer ser = new JavaScriptSerializer(typeof(Name));
我们可以使用
反序列化JSON
ser.Deserialize(json, typeof(Name));
或
ser.Deserialize<Name>(json);
这两个有什么区别吗?
开始此类问题的最佳位置是 source code itself。在这里我们看到:
public T Deserialize<T>(string input) {
return (T)Deserialize(this, input, typeof(T), RecursionLimit);
}
public object Deserialize(string input, Type targetType) {
return Deserialize(this, input, targetType, RecursionLimit);
}
这表明 Deserialize<T>
是 the same internal Deserialize
function 的包装,而无类型 Deserialize()
是。但是,使用它的好处是您可以返回已知类型,而不是 object
,因为它已经为您完成了转换。
在内部,Deserialize 和 Deserialize 都根据来源调用静态 JavaScriptSerializer.Deserialize():http://referencesource.microsoft.com/#System.Web.Extensions/Script/Serialization/JavaScriptSerializer.cs,a161828699d90ec4,references
反序列化:
public T Deserialize<T>(string input) {
return (T)Deserialize(this, input, typeof(T), RecursionLimit);
}
反序列化:
public object Deserialize(string input, Type targetType) {
return Deserialize(this, input, targetType, RecursionLimit);
}
我意识到有两种方法可以将 JSON 反序列化为一个对象。
所以假设我有一个包含 JSON 数据的字符串 json
、一个名为 Name
的类型和一个名为 ser
:
JavaScriptSerializer ser = new JavaScriptSerializer(typeof(Name));
我们可以使用
反序列化JSONser.Deserialize(json, typeof(Name));
或
ser.Deserialize<Name>(json);
这两个有什么区别吗?
开始此类问题的最佳位置是 source code itself。在这里我们看到:
public T Deserialize<T>(string input) {
return (T)Deserialize(this, input, typeof(T), RecursionLimit);
}
public object Deserialize(string input, Type targetType) {
return Deserialize(this, input, targetType, RecursionLimit);
}
这表明 Deserialize<T>
是 the same internal Deserialize
function 的包装,而无类型 Deserialize()
是。但是,使用它的好处是您可以返回已知类型,而不是 object
,因为它已经为您完成了转换。
在内部,Deserialize
反序列化
public T Deserialize<T>(string input) {
return (T)Deserialize(this, input, typeof(T), RecursionLimit);
}
反序列化:
public object Deserialize(string input, Type targetType) {
return Deserialize(this, input, targetType, RecursionLimit);
}