Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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_Deserialization_Json Deserialization - Fatal编程技术网

C# 反序列化JSON对象:使用哪一个?

C# 反序列化JSON对象:使用哪一个?,c#,json,deserialization,json-deserialization,C#,Json,Deserialization,Json Deserialization,我意识到有两种方法可以将JSON反序列化为对象 因此,假设我有一个包含json数据的字符串json,一个名为Name的类型,以及一个名为ser的JavaScriptSerializer: JavaScriptSerializer ser = new JavaScriptSerializer(typeof(Name)); 我们可以使用 ser.Deserialize(json, typeof(Name)); 或 ser.Deserialize(json); 这两个问题之间有什么区别吗?从这类

我意识到有两种方法可以将JSON反序列化为对象

因此,假设我有一个包含json数据的字符串
json
,一个名为
Name
的类型,以及一个名为
ser
的JavaScriptSerializer:

JavaScriptSerializer ser = new JavaScriptSerializer(typeof(Name));
我们可以使用

ser.Deserialize(json, typeof(Name));

ser.Deserialize(json);

这两个问题之间有什么区别吗?

从这类问题开始的最佳位置是。我们看到:

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);
}
public T反序列化(字符串输入){
return(T)反序列化(this,input,typeof(T),RecursionLimit);
}
公共对象反序列化(字符串输入,类型targetType){
返回反序列化(this、input、targetType、RecursionLimit);
}

这表明
反序列化
是非类型的
反序列化()的包装。然而,使用它的好处是,你可以得到一个已知的类型,而不是一个
对象
,因为它为你完成了角色转换。

从这类问题开始的最佳位置是。我们看到:

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);
}
public T反序列化(字符串输入){
return(T)反序列化(this,input,typeof(T),RecursionLimit);
}
公共对象反序列化(字符串输入,类型targetType){
返回反序列化(this、input、targetType、RecursionLimit);
}

这表明
反序列化
是非类型的
反序列化()的包装。但是,使用它的好处是,您可以返回一个已知类型,而不是一个
对象,因为它为您完成了转换。

在内部,反序列化和反序列化都调用静态JavaScriptSerializer。反序列化()根据源代码:

反序列化

public T Deserialize<T>(string input) {
        return (T)Deserialize(this, input, typeof(T), RecursionLimit);
    }

在内部,反序列化和反序列化都会根据源调用静态JavaScriptSerializer.Deserialize()

反序列化

public T Deserialize<T>(string input) {
        return (T)Deserialize(this, input, typeof(T), RecursionLimit);
    }

那么,你要说的是,两者实际上是相同的,只有第一个返回一个类型为T的对象,第二个返回一个我们需要自己强制转换的对象?如果可能的话,使用泛型版本。最好是使用强类型的返回值,而不是一堆等待您在强制转换中出错的对象。因此,您要说的是,这两者实际上是相同的,只有第一个返回类型为T的对象,第二个返回我们需要自己强制转换的对象?如果可能,请使用通用版本。最好是使用强类型返回值,而不是一堆对象,等待您在强制转换中出错。省得麻烦,使用json.net:,两种Microsoft实现(JavaScriptSerializer和DataContractSerializer)都有奇怪的怪癖。@Matthew我同意,我自己也可以使用newtonsoft——不过,该库具有这些方法的有效等效性,导致了相同的问题。我知道我的评论没有回答这个问题,但希望这能让OP在浪费时间处理奇怪的问题之前使用一个像样的序列化程序。@Matthew:即使是Microsoft的团队也使用Json.Net而不是传统的序列化程序,所以你再正确不过了,省得沮丧,使用Json.Net:,这两种Microsoft实现(JavaScriptSerializer和DataContractSerializer)有奇怪的怪癖。@Matthew我同意,我自己也使用newtonsoft-但是,该库具有这些方法的有效等效物,导致了相同的问题。我知道我的评论没有回答这个问题,但希望这能让OP在浪费时间处理奇怪的问题之前使用一个像样的序列化程序。@Matthew:即使是微软的团队也使用Json.Net而不是传统的序列化程序,所以你再正确不过了