Json C # многомерный доступ к массиву - PullRequest
0 голосов
/ 03 октября 2019

Цель программы - найти общее количество фильмов, в которых участвовал персонаж.

Я пытаюсь получить доступ к объекту типа 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;

Так что вопрос в том, как мне получить доступ к фильмам, которые находятся внутри результатови найти длину?

Редактировать: Я понимаю, что это может быть не самый лучший способ написать эту программу, однако, не возможно ли просто получить доступ к дочернему массиву основного массива с текущим кодом?

1 Ответ

2 голосов
/ 03 октября 2019

Прежде всего, я бы посоветовал не использовать dynamic, так как это вызовет у вас головную боль. Если вы все равно собираетесь работать с JObjects и JArrays, то лучше использовать эти типы напрямую. Компилятор сможет раньше обнаружить ошибки, и вы получите помощь Intellisense в Visual Studio. Итак, проанализируйте ваш JSON следующим образом:

JObject rootObject = JObject.Parse(jsonResult);

Отсюда вы можете получить массив результатов. (Вы вызывали этот массив x в своем коде, но я думаю, resultsArray - это более описательное имя переменной):

JArray resultsArray = (JArray)rootObject["results"];

Как и любой массив, если вы хотите получить определенный элемент, вынужно использовать свой индекс. Мы можем получить первый элемент массива (это объект, содержащий данные Люка Скайуокера) следующим образом:

JObject characterObject = (JObject)resultsArray[0];

Оттуда вы можете получить свойство films, которое также является JArray:

JArray filmsArray = (JArray)characterObject["films"];

Чтобы получить длину JArray, вы используете свойство Count:

numberOfFilms = filmsArray.Count;

Fiddle: https://dotnetfiddle.net/iFAWB4

Теперь, когда выпошагово разбирайтесь в объектах и ​​массивах, я покажу вам небольшой ярлык, метод SelectToken(). Этот метод позволяет вам указать «путь» для получения конкретного JToken (JObject и JArray - оба типа JTokens). Итак, после синтаксического анализа вашего JSON вы можете получить массив films непосредственно следующим образом:

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

, а затем получить его количество, как и раньше.

Fiddle: https://dotnetfiddle.net/zOdSFs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...