Как мне вернуть список из объекта JSON? - PullRequest
1 голос
/ 17 июня 2020

Я создаю свое первое приложение в Xamarin Forms, которое будет считывать информацию из базы данных SQL через веб-запрос. Я дошел до того, что успешно прочитал и отобразил информацию в приложении WinForms. Хотя в Xamarin Forms я не могу получить тот же результат.

На главной странице я вызываю:

var jobService = new JobService();
listView.ItemsSource = jobService.JobList(DatePicker.Date);

Затем в классе JobService это мой код.

class JobService
{
    List<Job> jobs;
    string userId; 
    string date;

    public List<Job> JobList(DateTime datetime)
    {
        userId = 1234;
        date = datetime.ToString("MM-dd-yyyy");

        Client();
        return jobs;
    }

    public void Client()
    {
        WebClient client = new WebClient();
        Uri uri = new Uri("http://Location/webservice.php");
        NameValueCollection parameters = new NameValueCollection();

        parameters.Add("UserId", userId);
        parameters.Add("Date", date);

        client.UploadValuesCompleted += Client_UploadValuesCompleted;
        client.UploadValuesAsync(uri, parameters);
    }

    public void Client_UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e)
    {
        jobs = JsonConvert.DeserializeObject<List<Job>>(Encoding.UTF8.GetString(e.Result));
    }

В WinForms это мой код

private void Button_Click(object sender, EventArgs e)
    {
        WebClient client = new WebClient();
        Uri uri = new Uri("http://Location/webservice.php");
        NameValueCollection parameters = new NameValueCollection();

        parameters.Add("UserId", 1234);
        parameters.Add("Date", datetime.ToString("MM-dd-yyyy"));

        client.UploadValuesCompleted += Client_UploadValuesCompleted;
        client.UploadValuesAsync(uri, parameters);
    }

    private void Client_UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e)
    {
        List<Job> jobs = JsonConvert.DeserializeObject<List<Job>>(Encoding.UTF8.GetString(e.Result));           
        MessageBox.Show(jobs[0].Project); //Project is one of the properties of the Job Class
    }

Это класс задания:

public class Job
{
    [JsonProperty("Project")]
    public string Project { get; set; }

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

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

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

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

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

При отладке решения Xamarin я заметил, что jobs возвращается как null. Возвращается ли он до завершения UploadValuesAsync?

Я использую Visual Studio 2019 (16.6.0),. NET версии 4.8. Я тоже использую Newtonsoft. Json Packet.

Заранее спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Спасибо за все ваши ответы. Я решил проблему, используя HttpClient и узнав больше о async / await. Это мой код. Честно говоря, мне кажется, что я до сих пор недостаточно знаю об этом topi c, чтобы быть уверенным в этом, поэтому, если кто-то думает, что код может быть чище, не стесняйтесь eleborate:)

Это мой текущий ( рабочий) код:

На MainPage я вызываю:

var jobService = new JobService();
var jobList = await jobService.JobListAsync(DatePickerInvisible.Date); //I will use this list for further display actions.

Затем в классе JobService это мой код:

class JobService
{
    string userId; 
    string date;
    public List<Job> Jobs { get; private set; }
    HttpClient client = new HttpClient();

    public async Task<List<Job>> JobListAsync(DateTime datetime)
    {
        userId = 1234;
        date = datetime.ToString("MM-dd-yyyy");

        Jobs = new List<Job>();
        var uri = new Uri("http://Location/webservice.php");

        IEnumerable<KeyValuePair<string, string>> queries = new List<KeyValuePair<string, string>>()
        {
            new KeyValuePair<string, string>("UserId", userId),
            new KeyValuePair<string, string>("Date", date)
        };

        HttpContent q = new FormUrlEncodedContent(queries);

        try
        {
            var response = await client.PostAsync(uri, q);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                Jobs = JsonConvert.DeserializeObject<List<Job>>(content);
            }
        }

        catch (Exception ex)
        {
            Debug.WriteLine(@"ERROR {0}", ex.Message);
        }

        return Jobs;
    }
}

Класс Job остается то же самое.

Еще раз спасибо за помощь. Ваши комментарии в совокупности направили меня на правильный путь.

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