为什么当我调用JsonConvert时,将JArray分配给var会失败.反序列化对象()



在这行代码上:

var arr = JsonConvert.DeserializeObject<JArray>(s);

我得到了,">无法强制转换类型为"Newtonsoft"的对象。Json。林克。JObject"to type"Newtonsoft。Json。林克。J阵列'">

我把那行改成了这个:

JArray arr = JsonConvert.DeserializeObject<JArray>(s);      

并且得到了相同的错误消息。

我把它改成这个:

var arr = JsonConvert.DeserializeObject<JObject>(s);

它甚至无法编译。

此时调用读取的值(字符串s(为:

{"id":347745,"results":[{"iso_3166_1":"US","release_dates":[{"certification":"","iso_639_1":"","note":"","release_date":"1936-12-12T00:00:00.000Z","type":3}]}]}

我想要的只是";"认证";;在这种情况下,证明值是空字符串("证明":"(

在上下文中,代码是:

. . .
try
{
var webRequest = (HttpWebRequest)WebRequest.Create(RESTStringToGetMPAARatingForMovieId);
webRequest.Method = "GET";  
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
{
StreamReader streamReader = new StreamReader(webResponse.GetResponseStream());
string s = streamReader.ReadToEnd();
var arr = JsonConvert.DeserializeObject<JArray>(s);
//JArray arr = JsonConvert.DeserializeObject<JArray>(s);
//var arr = JsonConvert.DeserializeObject<JObject>(s);
foreach (JObject obj in arr)
{
_currentMPAARating = (string)obj["certification"];
. . .
}
}
else
{
MessageBox.Show(string.Format("Status code == {0}, Content length == {1}",
webResponse.StatusCode, webResponse.ContentLength));
}    
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

您的JSON不是数组,它是一个包含数组(results(的对象。但实际上它比这更复杂:您要查找的certification字符串嵌套在第二个release_dates数组中。

如果您获取JSON并使用JSON验证器/美化程序对其进行重新格式化,它应该会变得更加清晰:

{
"id": 347745,
"results": [
{
"iso_3166_1": "US",
"release_dates": [
{
"certification": "",
"iso_639_1": "",
"note": "",
"release_date": "1936-12-12T00:00:00Z",
"type": 3
}
]
}
]
}

因此,要使用常规的foreach循环获得您正在寻找的数据,您需要这样的代码:

var obj = JsonConvert.DeserializeObject<JObject>(s);
var resultArr = (JArray)obj["results"];
foreach (JObject resultObj in resultArr)
{
var releaseDatesArr = (JArray)resultObj["release_dates"];
foreach (JObject releaseDateObj in releaseDatesArr)
{
_currentMPAARating = (string)releaseDateObj["certification"];
// ...
}
}

Fiddle:https://dotnetfiddle.net/SMzQTw

如果你只需要一个项目,这里有一个快捷方式。使用带有递归下降算子(..(的SelectToken方法,如下所示:

var obj = JsonConvert.DeserializeObject<JObject>(s);
_currentMPAARating = (string)obj.SelectToken("..certification");

Fiddle:https://dotnetfiddle.net/S1ScLO

但请注意,以上内容只会返回第一场比赛。如果您希望获得多个证书,您可以使用SelectTokens(复数(:

var obj = JsonConvert.DeserializeObject<JObject>(s);
var ratings = obj.SelectTokens("..certification").Select(t => (string)t).ToList();

Fiddle:https://dotnetfiddle.net/zyjNnJ

最新更新