C# NewtonSoft Json使用括号方法检索数据
目前我正在使用YouTube API获取一些数据。数据是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
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;