程序的重点是查找角色参与的电影总数。
我正在尝试访问Newtonsoft.Json.Linq.JArray
类型的对象以计算多维数组的长度。
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
"hair_color": "blond",
"skin_color": "fair",
"eye_color": "blue",
"birth_year": "19BBY",
"gender": "male",
"homeworld": "descriptiontext",
"films": [
"linkapifilms1",
"linkapifilms2",
"linkapifilms3",
"linkapifilms6",
"linkapifilms7"
],
"species": [],
"vehicles": [
"linapivehicles14",
"linapivehicles30"
],
"starships": [
"linapistarships12",
"linapistarships22"
],
"created": "2014-12-09T13:50:51.644000Z",
"edited": "2014-12-20T21:17:56.891000Z",
"url": "linkapipeople1"
}
]
}
我正在尝试访问"films":
以计算数组的长度并将其存储/显示在int变量上。
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
public class Solution
{
static void Main()
{
Console.WriteLine("Number of films: " + Run("Luke Skywalker"));
Console.ReadKey();
}
static public int Run(string character)
{
int numberOfFilms = 0;
Task<string> result = GetResponseString(character);
var jsonResult = result.Result;
dynamic dynamicResultObject = JsonConvert.DeserializeObject(jsonResult);
JArray x = dynamicResultObject.results;
//Find length of "films" code insert//
Console.WriteLine(character);
return numberOfFilms;
}
static public async Task<string> GetResponseString(string character)
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync("linktoapi/api/people/?search=" + character);
var contents = await response.Content.ReadAsStringAsync();
return contents;
}
}
我可以用dynamicResultObject.results;
访问数组的第一行
编辑:我知道这可能不是编写此程序的最佳方法,但是,是否不可能仅使用当前代码访问主数组的子数组?
我不熟悉您使用的方法,但我个人使用此方法:
string RawResult = GetResponseString(character);
data = (JArray)JsonConvert.DeserializeObject(RawResult);
int filmsAmout = data["results"]["films"].GetLength();
Console.WritLine(filmsAmount); //Should write the number of films in the array data
并且如果您想尝试一下,它也可以正常工作。
首先,我建议您不要使用dynamic
,因为它只会引起您的头痛。无论如何,如果您要使用JObjects
和JArrays
,最好直接使用这些类型。编译器将能够更早地检测到错误,并且您将在Visual Studio中获得Intellisense帮助。因此,像这样解析您的JSON:
JObject rootObject = JObject.Parse(jsonResult);
由此您可以获得结果数组。 (您曾在代码中调用此数组x
,但我认为resultsArray
是更具描述性的变量名称):
JArray resultsArray = (JArray)resultObject["results"];
像任何数组一样,如果要获取特定元素,则需要使用其索引。我们可以像这样获得数组的第一个元素(它是包含Luke Skywalker数据的对象):
JObject characterObject = (JObject)resultsArray[0];
从那里,您可以获得films
属性,它也是JArray
:
JArray filmsArray = (JArray)characterObject["films"];
要获取JArray
的长度,请使用Count
属性:
numberOfFilms = filmsArray.Count;
现在,您知道如何逐步钻取对象和数组,我将向您展示一些捷径,即SelectToken()
方法。此方法允许您指定“路径”以获取特定的JToken
(JObject
和JArray
均为JTokens
的类型)。因此,在解析了JSON之后,您可以像这样获得films
数组:
JArray filmsArray = (JArray)rootObject.SelectToken("results[0].films");
然后像以前一样获得计数。或者,如果您想要第一部电影的名称,则可以执行以下操作:
string firstFilm = (string)rootObject.SelectToken("results[0].films[0]");