Я не могу понять, как извлечь переменные из API - PullRequest
0 голосов
/ 19 января 2020

Я пытался исправить эту проблему с моим проектом некоторое время, getjokes возвращает нулевые значения, и хотя у меня нет никаких ошибок. Я пытаюсь создать приложение, в котором показана простая шутка. Ссылка API здесь APIlink .

Это первый раз, когда я что-то здесь надеваю, так что, вероятно, я делаю это неправильно, но если кто-то может помочь, я буду признателен за это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace JokeApp.Classes
{
    public class Main
    {
        [JsonProperty("category")]
        public string Category { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("setup")]
        public string Setup { get; set; }

        [JsonProperty("delivery")]
        public string Delivery { get; set; }

        [JsonProperty("id")]
        public int Id { get; set; }
    }

    public class catagories
    {
        [JsonProperty("categories")]
        public List<String> Categories { get; set; }
    }

    public class main
    {
        [JsonProperty("Main")]
        public Main Main { get; set; }

        [JsonProperty("categories")]
        public string catogories { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net.Http;
using Windows.UI.Popups;

namespace JokeApp.Classes
{
    class CardWrapper
    {
        public static async Task<Main> Getjokes()
        {
            Uri request = new Uri(@"https://sv443.net/jokeapi/category/any");

            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Add("User_Agent" ,"JokeApp");
            HttpResponseMessage respons = await client.GetAsync(request);

            if (respons.IsSuccessStatusCode == false)
            {
                MessageDialog md = new MessageDialog("Cant find jokes!!");
                await md.ShowAsync();
            }

            respons.EnsureSuccessStatusCode();

            main mc = await respons.Content.ReadAsAsync<main>();

            return mc.Main;
        }
    }
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

using JokeApp.Classes;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using static JokeApp.Classes.Main;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace JokeApp
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page,INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public MainPage()
        {
            this.InitializeComponent();
            Getjokes();
        }

        private Main _joke = new Main();

        public Main Jokes
        {
            get { return _joke; }
            set { _joke = value; NotifyPropertyChanged(); }
        }

        private async void Getjokes()
        {
           Jokes  = await CardWrapper.Getjokes();
        }
    }
}

1 Ответ

1 голос
/ 20 января 2020

Ответ от sv443 выглядит так, как если бы он десериализовался для объекта класса Main, а не класса main. Таким образом, вы, вероятно, хотите:

Main m c = ожидайте отклика.Content.ReadAsAsyn c ();

вместо

main m c = await response.Content.ReadAsAsyn c ();

В общем, плохая идея иметь два определения классов, которые отличаются только заглавными буквами, именно потому, что это тип проблемы может возникнуть.

Если это не так, попробуйте зарегистрировать свой respons.Content как string и посмотрите, что там на самом деле.

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