我如何 return 来自 JSON 对象的列表?

How do I return a List from a JSON object?

我正在用 Xamarin Forms 构建我的第一个应用程序,它将通过网络请求从 SQL 数据库中读取信息。 我已经到了可以在 WinForms 应用程序中成功读取和显示信息的地步。虽然,在 Xamarin Forms 中我似乎无法得到相同的结果。

在主页上我调用:

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

然后,在 JobService 中 class 这是我的代码。

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
    }

这就是工作 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 returns 为 null。在 UploadValuesAsync 完成之前是否被归还?

我正在使用 Visual Studio 2019 (16.6.0),.NET 4.8 版。我也在使用 Newtonsoft.Json 数据包。

提前致谢!

感谢您的所有回复。我通过使用 HttpClient 并了解有关 async / await 的更多信息来解决问题。这是我的代码。老实说,我觉得我对这个主题的了解还不够多,因此我对它没有信心,所以如果有人认为代码可以更简洁,请随时详细说明:)

这是我当前的(工作)代码:

在主页上我调用:

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

然后,在 JobService class 这是我的代码:

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;
    }
}

作业 Class 保持不变。

再次感谢您对我的帮助。你的评论加在一起让我走上了正确的道路。