如何从 JSON 对象返回列表?

Posted

技术标签:

【中文标题】如何从 JSON 对象返回列表?【英文标题】:How do I return a List from a JSON object? 【发布时间】:2020-10-06 21:40:58 【问题描述】:

我正在 Xamarin Forms 中构建我的第一个应用程序,它将通过 Web 请求从 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 数据包。

提前致谢!

【问题讨论】:

JSON 的结构如何?你有一个例子吗?你的Job 班级呢? 嗨!我已将工作类添加到帖子中。一个例子:我将用户名和日期发送到 php webservice。它返回一个 JSON 对象,其中包含 Job Class 中列出的属性。我是新手,所以我不确定 JSON 的结构是怎样的,但我可以将它反序列化为一个列表。在 PHP 文件中,我调用 ''echo json_encode($list);'这有什么用吗? 我所说的示例的意思是拥有实际的 JSON 内容。在您的代码中,您有一个Encoding.UTF8.GetString(e.Result)。那包含什么?如果它与您定义的结构不匹配,它将像您看到的那样失败。乍一看,我怀疑它可能是您使用的 JsonProperty 属性。最有可能的是,它们需要是projectserviceclient 等。 嗨,Sotiris,感谢您的帮助!返回的 JSON 字符串如下所示: ["Project":"Project1","Service":"Knitting","Client":"Client1","StartTime":"09:00","EndTime": "17:00","日期":"01-01-2020"]。作业类在 WinForms 项目中是相同的,它在其中工作。那将排除更改属性名称的可能性吗? 尝试将您的Client() 设置为Task&lt;void&gt; 并在JobList 中设置await Client(); 【参考方案1】:

感谢您的所有回复。我通过使用HttpClient 解决了这个问题,并进一步了解了async / await。这是我的代码。老实说,我觉得我对这个话题的了解还不够,所以没有足够的信心,所以如果有人认为代码可以更干净,请随意阐述:)

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

在我调用的 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;
    

作业类别保持不变。

再次感谢您帮助我。你们的 cmets 加起来让我走上了正确的道路。

【讨论】:

以上是关于如何从 JSON 对象返回列表?的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring Boot 控制器返回非 JSON 数据(对象列表)

为啥 JSON 查询如果有一个元素则返回对象,如果有多个则返回列表?

使用 json.net 在列表中返回嵌套的 json 对象

WCF REST JSON 返回动态列表

Spring Boot 无法为对象返回 JSON,但不能为对象列表返回 JSON

如何在ajax返回时解析字符串的JSON列表?