目前我正在使用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"];
目前导致错误:
无法将[]索引应用于' object'
类型的表达式
我现在面临的问题是我不知道如何正确反序列化对象,因此我可以使用文本索引来获取数据。我过去常常这样做,但我无法回忆起它,也无法找到关于我方法的任何信息。
答案 0 :(得分:7)
您应该做的是定义一个包含与您的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
是字符串,或者当你试图访问它时,它会抛出一个运行时异常。
答案 1 :(得分:2)
通常,如果我正在处理JSON有效负载,我不想映射到强类型,我使用允许LINQ到JSON的JObject。
var jObject = JObject.Parse(jsonString);
这将允许使用[]
语法对对象的属性建立索引。
有关在API docs中使用LINQ to JSON的更多信息。
答案 2 :(得分:0)
将Deserialized
数据转换为dynamic
类型:
dynamic results = JsonConvert.DeserializeObject(jsonData);
然后使用.
访问它:
string duration = results.items.contentDetails.duration;
您正在使用的语法用于javascript。
答案 3 :(得分:0)
尝试这种方式:
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