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

C# NewtonSoft Json使用括号方法检索数据,c#,json,json.net,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="); v

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


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

反序列化的
数据放入
动态
类型:

dynamic results = JsonConvert.DeserializeObject(jsonData);
然后使用
访问它:

string duration = results.items.contentDetails.duration;

您使用的语法在javascript中使用。

您应该使用与JSON匹配的所有属性定义一个类,然后将该类作为类型参数传递给反序列化:

Results results = JsonConvert.DeserializeObject<Results>(jsonData);
如果需要帮助将JSON响应转换为C#类,可以使用以下转换器


还可以反序列化为动态类型,如下所示:

var results = JsonConvert.DeserializeObject<dynamic>(jsonData);

但是,大多数情况下不建议使用
动态
,因为它可以有效地删除静态键入,所以您必须确保
持续时间
将是一个字符串,或者,当您尝试访问它时,它会抛出运行时异常。

通常,如果我处理的是一个JSON负载,我不想映射到强类型,那么我使用允许LINQ到JSON的JObjects

var jObject = JObject.Parse(jsonString);
这将允许使用
[]
语法对对象的属性进行索引

有关在中使用LINQ to JSON的详细信息。

请尝试以下方法:

dynamic results = JsonConvert.DeserializeObject(jsonData);
那你就可以了

string duration = results["items"]["contentDetails"]["duration"];


对MSDN上动态关键字的引用:

它不是反序列化对象吗?还会发生什么?我在下面的一行中得到一个错误:字符串持续时间=结果[“items”][“contentDetails”][“duration”];如下所述:无法对“object”类型的表达式应用带[]的索引您会收到该错误,因为您反序列化为类型
object
,而不是其他类型。您必须通过括号方法访问吗?为什么不反序列化到某个强类型对象,例如:
MyCustomType实例=JsonConvert.DeserializeObject(jsonData)
@mason当您没有定义自定义类型来解析JSON字符串时,您可以使用
var
来获得它,并使用
@Shaharyar访问数据。不,
var
并不神奇。您仍然需要向反序列化程序指定希望的类型。也许您想到的是
动态
关键字,它不应该被滥用。
结果
属于
对象
类型,没有
属性。不,它没有<代码>对象
没有
属性。如果您不知道,下面是。我尝试过,但得到以下警告:'object'不包含'items'的定义,并且找不到接受'object'类型的第一个参数的扩展方法'items'(是否缺少using指令或程序集引用?)您缺少
dynamic
关键字。使用dynamic是什么意思?
dynamic results = JsonConvert.DeserializeObject(jsonData);
string duration = results["items"]["contentDetails"]["duration"];
string duration = results.items.contentDetails.duration;