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

本文关键字:方法 检索 数据 Json NewtonSoft | 更新日期: 2023-09-27 18:30:18

目前我正在使用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"];

目前,这会导致错误:

无法将 [] 的索引应用于类型为"对象"的表达式

我现在面临的问题是我不知道如何正确反序列化对象,以便我可以使用文本索引来获取数据。我以前曾经这样做过,但我不记得了,也找不到关于我的方法的任何信息。

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

你应该做的是定义一个类,其中包含与 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