如何从 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
属性。最有可能的是,它们需要是project
、service
、client
等。
嗨,Sotiris,感谢您的帮助!返回的 JSON 字符串如下所示: ["Project":"Project1","Service":"Knitting","Client":"Client1","StartTime":"09:00","EndTime": "17:00","日期":"01-01-2020"]。作业类在 WinForms 项目中是相同的,它在其中工作。那将排除更改属性名称的可能性吗?
尝试将您的Client()
设置为Task<void>
并在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 查询如果有一个元素则返回对象,如果有多个则返回列表?