Json C#多维数组访问

问题描述 投票:0回答:2

程序的重点是查找角色参与的电影总数。

我正在尝试访问Newtonsoft.Json.Linq.JArray类型的对象以计算多维数组的长度。

Json数组:

{
    "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;访问数组的第一行

所以问题是我如何获取电影,这是内部结果并找到长度?

编辑:我知道这可能不是编写此程序的最佳方法,但是,是否不可能仅使用当前代码访问主数组的子数组?

c# arrays json json.net json-api
2个回答
0
投票

我不熟悉您使用的方法,但我个人使用此方法:

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

并且如果您想尝试一下,它也可以正常工作。


0
投票

首先,我建议您不要使用dynamic,因为它只会引起您的头痛。无论如何,如果您要使用JObjectsJArrays,最好直接使用这些类型。编译器将能够更早地检测到错误,并且您将在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()方法。此方法允许您指定“路径”以获取特定的JTokenJObjectJArray均为JTokens的类型)。因此,在解析了JSON之后,您可以像这样获得films数组:

JArray filmsArray = (JArray)rootObject.SelectToken("results[0].films");

然后像以前一样获得计数。或者,如果您想要第一部电影的名称,则可以执行以下操作:

string firstFilm = (string)rootObject.SelectToken("results[0].films[0]");
© www.soinside.com 2019 - 2024. All rights reserved.