NewtonSoft Json使用括号方法检索数据

Qua*_*ain 1 c# json json.net

目前,我正在使用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"类型的表达式

我现在面临的问题是我不知道如何正确地反序列化对象,所以我可以使用文本索引来获取数据.我之前曾经这样做过,但我无法回忆起它,也无法找到关于我方法的任何信息.

Art*_*hez 7

你应该做的是定义一个具有与你的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将是一个字符串,或者它会抛出一个运行时异常,当您尝试访问它.