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

时间:2016-01-14 18:39:26

标签: 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"];

目前导致错误:

  

无法将[]索引应用于' object'

类型的表达式

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

4 个答案:

答案 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