从Wikipedia获取数据的代码:
string URL = $"https://en.wikipedia.org/w/api.php?action=query&format=json&list=&titles={query}&redirects=1";
WebRequest wrREQUEST;
wrREQUEST = WebRequest.Create(URL);
wrREQUEST.Proxy = null;
wrREQUEST.Method = "GET";
WebResponse response = wrREQUEST.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
string responseData = streamReader.ReadToEnd();
JObject jsonData = JObject.Parse(responseData);
var jsonQuery = jsonData["query"];
string pageID = (string)jsonQuery;
但是我一直得到
抛出异常:'System. 'Newtonsoft.Json.dll中的ArgumentException
和json数据看起来像这样:
{
"batchcomplete":"",
"query":{
"pages":{
"31717":{
"pageid":31717,
"ns":0,
"title":"United Kingdom"
}
}
}
}
我还想知道,由于"pages":{"31717":{}}
是一个我事先不知道的ID,我如何通过枚举数据得到31717
?
错误是因为您试图显式地将JObject
转换为string
,这是不可能使用转换的,只能使用序列化。
但我知道你实际上想要的是"PageId",从json结构来看,你需要取"第一个键"从回应来看。(其实还有更多的方法)
所以不用
string pageID = (string)jsonQuery;
一种可能的方法是使用
((JProperty)jsonQuery["pages"].First()).Name
请找到您的请求的解决方案,可能有些时候您将无法获得第一个元素值,这将触发一些异常。
请换行:
string pageID = (string)jsonQuery;
**var jToken = jsonQuery["pages"].First;
if (jToken != null)
{
string pageID = ((JProperty) jToken).Name;
}**