目前我正在使用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"];
目前,这会导致错误:
无法将 [] 的索引应用于类型为"对象"的表达式
我现在面临的问题是我不知道如何正确反序列化对象,以便我可以使用文本索引来获取数据。我以前曾经这样做过,但我不记得了,也找不到关于我的方法的任何信息。
你应该做的是定义一个类,其中包含与 JSON 匹配的所有属性,然后将该类作为类型参数传递给反序列化:
Results results = JsonConvert.DeserializeObject<Results>(jsonData);
我没有关于您的 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; }
}
如果需要有关将 JSON 响应转换为 C# 类的帮助,可以使用转换器,例如 http://json2csharp.com/
还可以反序列化为动态类型,如下所示:
var results = JsonConvert.DeserializeObject<dynamic>(jsonData);
然后,您只需访问您的属性:
string duration = results.items.contentDetails.duration;
但是,大多数时候不建议使用 dynamic
,因为它有效地删除了静态类型,因此您必须确保duration
将是一个字符串,否则当您尝试访问它时,它将引发运行时异常。
如果我正在处理一个不想映射到强类型的 JSON 有效负载,我会使用 JObjects,它允许 LINQ 到 JSON。
var jObject = JObject.Parse(jsonString);
这将允许使用[]
语法对对象的属性进行索引。
有关使用 LINQ to JSON 的更多信息,请参阅 API 文档。
将Deserialized
数据转换为dynamic
类型:
dynamic results = JsonConvert.DeserializeObject(jsonData);
然后使用以下.
访问它:
string duration = results.items.contentDetails.duration;
你正在使用的语法在javascript中使用。
试试这个方式:
dynamic results = JsonConvert.DeserializeObject(jsonData);
然后你可以做
string duration = results["items"]["contentDetails"]["duration"];
或
string duration = results.items.contentDetails.duration;
对 MSDN 上的动态关键字的引用:https://msdn.microsoft.com/en-us/library/dd264736.aspx