目前,我正在使用YouTube API获取一些数据.数据在json中,我试图获得它的一部分.
我现在面临的问题是我想使用以下方法:
WebClient client = new WebClient();
string jsonData = client.DownloadString("https://www.googleapis.com/youtube/v3/videos?id=" + videoId + "&part=contentDetails&key=");
var results = JsonConvert.DeserializeObject(jsonData);
string duration = results["items"]["contentDetails"]["duration"];
Run Code Online (Sandbox Code Playgroud)
目前,这会导致错误:
无法将带有[]的索引应用于"object"类型的表达式
我现在面临的问题是我不知道如何正确地反序列化对象,所以我可以使用文本索引来获取数据.我之前曾经这样做过,但我无法回忆起它,也无法找到关于我方法的任何信息.
你应该做的是定义一个具有与你的JSON匹配的所有属性的类,然后将该类作为类型参数传递给反序列化:
Results results = JsonConvert.DeserializeObject<Results>(jsonData);
Run Code Online (Sandbox Code Playgroud)
我没有关于您的JSON的更多信息,但快速定义将如下所示:
public class Results
{
public Items items { get; set; }
}
public class Items
{
public ContentDetails contentDetails { get; set; }
}
public class ContentDetails
{
public string duration { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您需要帮助将JSON响应转换为C#类,可以使用转换器,例如http://json2csharp.com/
您也可以反序列化为动态类型,如下所示:
var results = JsonConvert.DeserializeObject<dynamic>(jsonData);
Run Code Online (Sandbox Code Playgroud)
然后,您只需访问您的属性:
string duration = results.items.contentDetails.duration;
Run Code Online (Sandbox Code Playgroud)
然而,在使用dynamic时不建议大部分的时间,因为它有效去除静态类型,因此你必须确保duration将是一个字符串,或者它会抛出一个运行时异常,当您尝试访问它.