@Urope

Как вывести из json только определенные элементы?

я делаю запрос к апи:
var client = new RestClient("https://api.kinopoisk.cloud/");
var request = new RestRequest($"movies/search/{movieTitle}/token/{TOKEN}", Method.GET);
var response = client.Execute(request).Content;


проблема в том, что апи возвращает кучу ненужных данных. Например, я ищу информацию по фильму "дурак", а возвращается информация по фильмам: "дурак", "дураков нет" и тд.

5fe5a16b32113996748408.png
как мне отсюда вывести информацию только о нужном мне фильме? я заметил, что нужный всегда стоит самым первым, значит нужно каким-то образом взять информацию из первого элемента массива?
  • Вопрос задан
  • 525 просмотров
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Берёшь свой запрос. Открываешь программу Postman. Отправляешь запрос. Копируешь полученный JSON в буфер обмена. Переходишь на какой-нибудь сайт вроде https://json2csharp.com/ и вставляешь туда JSON. Копируешь полученные классы, правильно именуешь. Параметры генерации классов:
5fe665235f0a1045486034.png

Кстати, для поискового запроса (текста) можно попробовать использовать Uri.EscapeUriString

Подключение быстрого сериализатора System.Text.Json из .NET Core

RestSharpExample.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="RestSharp" Version="106.11.7" />
    <PackageReference Include="RestSharp.Serializers.SystemTextJson" Version="106.11.7" />
  </ItemGroup>

</Project>


Api/Kinopoisk/KinopoiskService.cs
using System.Threading.Tasks;
using System.Web;
using RestSharp;
using RestSharp.Serializers.SystemTextJson;
using RestSharpExample.Api.Kinopoisk.Model;

namespace RestSharpExample.Api.Kinopoisk
{
    public class KinopoiskService
    {
        private const string API = "https://api.kinopoisk.cloud/";
        private const string TOKEN = "7777";

        private readonly RestClient _client;

        public KinopoiskService()
        {
            _client = new RestClient(API);
            _client.UseSystemTextJson();
        }

        public async Task<SearchResult> SearchAsync(string movieTitle)
        {
            var request = new RestRequest($"movies/search/{HttpUtility.UrlEncode(movieTitle)}/token/{TOKEN}", Method.GET);
            var response = await _client.ExecuteAsync<SearchResult>(request);
            return response.Data;
        }
    }
}


Program.cs
using System;
using System.Linq;
using System.Threading.Tasks;
using RestSharpExample.Api.Kinopoisk;
using RestSharpExample.Api.Kinopoisk.Model;

namespace RestSharpExample
{
    class Program
    {
        private KinopoiskService _kinopoisk;

        #region Entry point

        static async Task Main(string[] args)
        {
            var program = new Program();
            await program.Run(args);
        }

        #endregion

        private async Task Run(string[] args)
        {
            _kinopoisk = new KinopoiskService();

            try
            {
                string searchRequest = "Дурак";
                SearchResult result = await _kinopoisk.SearchAsync(searchRequest);
                Console.WriteLine($"Результаты поиска по запросу \"{searchRequest}\":");
                if (result.Results.Any())
                {
                    Display(result.Results.First());
                }
                else
                {
                    Console.WriteLine("Ничего не найдено.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

        private void Display(SearchMovieInfo info)
        {
            Console.WriteLine($"ИД: {info.Id}, Название: {info.Title}, Год: {info.Year}");
        }
    }
}


Api/Kinopoisk/Model/SearchResult.cs
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace RestSharpExample.Api.Kinopoisk.Model
{
    public class SearchResult
    {
        [JsonPropertyName("results")]
        public List<SearchMovieInfo> Results { get; set; }

        [JsonPropertyName("pagination")]
        public Pagination Pagination { get; set; }
    }
}


Api/Kinopoisk/Model/SearchMovieInfo.cs
using System.Text.Json.Serialization;

namespace RestSharpExample.Api.Kinopoisk.Model
{
    public class SearchMovieInfo
    {
        [JsonPropertyName("id")]
        public string Id { get; set; }

        [JsonPropertyName("id_kinopoisk")]
        public int IdKinopoisk { get; set; }

        [JsonPropertyName("title")]
        public string Title { get; set; }

        [JsonPropertyName("description")]
        public string Description { get; set; }

        [JsonPropertyName("year")]
        public int Year { get; set; }

        [JsonPropertyName("poster")]
        public string Poster { get; set; }

        [JsonPropertyName("rating_kinopoisk")]
        public double? RatingKinopoisk { get; set; }

        [JsonPropertyName("rating_imdb")]
        public double? RatingImdb { get; set; }
    }


Api/Kinopoisk/Model/Pagination.cs
using System.Text.Json.Serialization;

namespace RestSharpExample.Api.Kinopoisk.Model
{
    public class Pagination
    {
        [JsonPropertyName("current_page")]
        public string CurrentPage { get; set; }

        [JsonPropertyName("end_page")]
        public string EndPage { get; set; }

        [JsonPropertyName("total_pages")]
        public int TotalPages { get; set; }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
Есть метод Execute<T> в который можно прокинуть нужный тип
Прокидываете туда что-то типа FilmInfo[] и берёте от результата [0]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы