T型的对象应该是什么意思?
我似乎无法理解这一点。将一个JSON字符串解析为一个数组本来就是vbscript中最简单的东西..为什么它在.NET中更加复杂?
JavaScriptSerializer js = new JavaScriptSerializer();
//List<string> listJSON = new List<string>();
//IList<KeyValue> jList = js.Deserialize<IList<KeyValue>>(strJSON);
//List<KeyValue> persons = new JavaScriptSerializer()
// .Deserialize<List<KeyValue>>(strJSON);
//Console.WriteLine(persons.Count);
Array arrJSON = js.Deserialize<KeyValue[]>(strJSON);
public class KeyValue
{
public int id {get; set;}
public string name {get; set;}
}
错误是:没有为'WCFPull.KeyValue []'的类型定义无参数构造函数。
尚未填充数组 更新的代码:
namespace LoLSummoner
{
public class KeyValue
{
public int id {get; set;}
public string name {get; set;}
public int profileIconId {get; set;}
public int summonerLevel {get; set;}
public int revisionDate {get; set;}
}
}
namespace LoLSummoner
{
public class Summoner : ISummoner
{
public int GetSummonerID(string SummonerName)
{
int summonerId = 0;
WebClient client = new WebClient();
string strJSON = client.DownloadString("http://prod.api.pvp.net/api/lol/na/v1.2/summoner/by-name/" + SummonerName + "?api_key=xxx");
JavaScriptSerializer js = new JavaScriptSerializer();
KeyValue[] arrJSON = js.Deserialize<List<KeyValue>>(strJSON).ToArray();
return summonerId;
}
}
}
答案 0 :(得分:2)
T型是泛型 - http://msdn.microsoft.com/en-us/library/512aeb7t.aspx
除其他外,它允许客户端在实例化时指定对象类型。
答案 1 :(得分:2)
T
是通用类型参数。请参阅Generics (C# Programming Guide)。
泛型向.NET Framework引入了类型参数的概念,这使得设计类和方法成为可能,这些类和方法推迟了一个或多个类型的规范,直到通过客户端代码声明和实例化类或方法。
.. 通过使用泛型类型参数T,您可以编写其他客户端代码可以使用的单个类,而不会产生运行时强制转换或装箱操作的成本或风险。
(在这种情况下,JavaScriptSerializer也使用类型信息来确定如何将JSON解析为结果对象 - 这里它指示序列化程序将JSON数组解析为List of < / em>某种类型。)
代码失败,因为有Constraint on T,即:T : new()
:
使用
T : new()
,类型参数必须具有公共无参数构造函数[以便可以简单地创建类型为T的新实例]。
(但没有数组类型可以传递此约束;如果他们这样做了,那么最好的结果就是创建空数组的能力,因为数组有一个固定大小。)
要反序列化JSON,请使用最初显示的List<T>
类型(请注意使用具体类型):
IList<KeyValue> arrJSON = js.Deserialize<List<KeyValue>>(strJSON);
(对IList<KeyValue>
使用T
将不起作用,因为它是一个无法实例化的接口,并且T : new()
约束失败。但是,List<T>
实现了{{} 1}}这就是为什么可以声明变量使用接口的原因。)
或使用var
and type inference保存一些打字:
IList<T>
(隐式推断var arrJSON = js.Deserialize<List<KeyValue>>(strJSON);
变量的类型为arrJSON
。)
或者使用ToArray可枚举扩展方法真正取回List<KeyValue>
:
KeyValue[]
(它最初仍会被反序列化为List, I 通常会将其保存为List / Enumerable。)