Невозможно извлечь json из API-интерфейса Omdb и включить его в мой класс фильма, показывая «null» для всех параметров внутри объекта - PullRequest
0 голосов
/ 09 июля 2019

Я запустил новое приложение, которое использует API Omdb для получения информации о фильме. Цель приложения - получить заголовок фильма, используя ключевое слово для поиска. например: "shawshank" должен вернуть:

{"Search":[{"Title":"The Shawshank Redemption","Year":"1994","imdbID":"tt0111161","Type":"movie","Poster":"https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg"},{"Title":"Shawshank: The Redeeming Feature","Year":"2001","imdbID":"tt0293927","Type":"movie","Poster":"https://m.media-amazon.com/images/M/MV5BYjgwMjNjOGUtNzU3MC00MGM5LTk4NTctNGI5N2I2NGI0YjBhXkEyXkFqcGdeQXVyMjIzMTk0MzM@._V1_SX300.jpg"},{"Title":"Hope Springs Eternal: A Look Back at 'The Shawshank Redemption'","Year":"2004","imdbID":"tt0443041","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption: Cast Interviews","Year":"2004","imdbID":"tt5443390","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption (Scene)","Year":"2012","imdbID":"tt2477746","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Reflection","Year":"2015","imdbID":"tt3882670","Type":"movie","Poster":"N/A"},{"Title":"The Shawshank Redemption: Behind the Scenes","Year":"2004","imdbID":"tt5443386","Type":"movie","Poster":"N/A"}],"totalResults":"7","Response":"True"}

Проблема в том, что когда я запускаю приложение формы, я пытаюсь сохранить json в объект, предполагая, что если параметры моего объекта имеют одинаковое (без учета регистра) имя, элементы JSON будут сохранены в соответствующие переменные внутри объекта. Этого не происходит, поскольку параметры объекта остаются нулевыми.

Этот код был создан после просмотра видео на YouTube о создании приложения, которое использует онлайн-комиксы с помощью API. Я хотел вместо этого вытащить названия фильмов из Omdb. Были использованы следующие нюансы: Microsoft.AspNet.WebApi.Client v5.2.7 и Newtonsoft.Json v12.0.2. Ссылка на видео, которое было использовано для этого, выглядит следующим образом: https://www.youtube.com/watch?v=aWePkE2ReGw

Я попытался протестировать свой URL в браузере, и он успешно генерирует желаемый JSON. Я также попытался пройтись по коду и посмотреть переменные, которые я заметил, что из URL не удаляются данные. Я очень новичок в создании HTTP-соединений, а также в использовании API, так что это может быть легко исправить. После выполнения кода результаты отслеживаемых переменных выглядят следующим образом:

Name              Value               Type
Title           "MainWindow"          string
movie   {Movie_application.MovieModel}  Movie_application.MovieModel
Film.Title     null               string
url"http://www.omdbapi.com/?s=shawshank&apikey=568027e4" string
Tag            null               object
Title           "MainWindow"             string
Film    {Movie_application.MovieModel}  Movie_application.MovieModel
titlee             null                 string

mainwindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


namespace Movie_application
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public MainWindow()
        {
            InitializeComponent();
            //Start up the tcp/ip connection via HTTPclient 
            APIhelper.InitializeClient();
        }

        private async Task LoadResponseText(string Tag)
        {
            //grab the movie and put it in a local variable
            var Film = await MovieProcessor.LoadMovie(Tag);
            //create the full url of the poster 
            //var uriSource = new Uri(Film.Poster, UriKind.Absolute);
            //create a bitmap image out of url and put it in the display of the WP window
            //MoviePoster.Source = new BitmapImage(uriSource);

            Result_Text.Text = Film.Title;

        }

        private async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            await LoadResponseText("shawshank");
        }

        private async void SearchBtn_Click(object sender, RoutedEventArgs e)
        {
            await LoadResponseText(SearchBox.Text);
        }
    }
}


```APIhelper```

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;

    namespace Movie_application
    {
        public class  APIhelper
        {
            public static HttpClient ApiClient { get; set; }

            public static void InitializeClient()
            {
                //Create a new HttpClient object
                ApiClient = new HttpClient();
                //Clear headers out of HttpClient
                ApiClient.DefaultRequestHeaders.Accept.Clear();
                //Adds a header which requests a JSON data rather than web page tags etc.
                ApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            }
        }
    }

```MovieProcessor```

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;

    namespace Movie_application
    {
        public class MovieProcessor
        {


            public static async Task<MovieModel> LoadMovie(string search)
            {
                string url = "http://www.omdbapi.com/?s=" + search + "&apikey=568027e4";
                //call HTTPclient to open connection and await a response from destination
                using (HttpResponseMessage response = await APIhelper.ApiClient.GetAsync(url))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        //read in the response data in an asynch fashion 
                        MovieModel movie = await response.Content.ReadAsAsync<MovieModel>();
                        string titlee = movie.Title;
                        return movie;
                    }
                    else
                    {
                        throw new Exception(response.ReasonPhrase);
                    }
                }
            }
        }
    }

    ```MovieModel```
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Movie_application
    {
        public class MovieModel
        {
            public string Title  { get; set; }
            public string Poster { get; set; }
        }
    }



I expect the code to be able to write "The Shawshank Redemption" onto the form text box. The text box remains empty at the end of the run. Thanks in advance.


1 Ответ

0 голосов
/ 10 июля 2019

Похоже, что вы пытаетесь привести ответ непосредственно к MovieModel, когда на самом деле у корневого объекта есть поля типа Search, который является массивом.

{"Search":[...], "totalResults":"7", "Response":"True"}

Таким образом, чтобы исправить это, вам нужно создать модель, которая представляет этот корневой объект и имеет поле с именем Search, которое является массивом MovieModel.

Затем измените MovieModel movie = await response.Content.ReadAsAsync<MovieModel>();, чтобы вернуть любую новую модель, которую вы создаете

...