我正在尝试使用Web API从SQL服务器显示数据,在Xamarin.Android中编辑文本的方法。单击按钮后,数据将显示在编辑文本上。我已经按照YouTube教程中的所有步骤(确切地)进行了操作,但不幸的是,数据没有显示在编辑文本上,而是在屏幕上显示JSON格式。我该怎么做才能解决这个问题?
我尝试过使用Web服务,但仍然没有显示出来。
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.PersonalInfo);
ActionBar.SetDisplayHomeAsUpEnabled(true);
EditText email = FindViewById<EditText>(Resource.Id.txtEmail);
EditText firstName = FindViewById<EditText>(Resource.Id.txtFirstName);
EditText lastName = FindViewById<EditText>(Resource.Id.txtLastName);
EditText gen = FindViewById<EditText>(Resource.Id.txtGender);
EditText ic = FindViewById<EditText>(Resource.Id.txtIC);
EditText address = FindViewById<EditText>(Resource.Id.txtAddress);
EditText phoneNo = FindViewById<EditText>(Resource.Id.txtPhoneNo);
EditText username = FindViewById<EditText>(Resource.Id.txtUsername);
EditText password = FindViewById<EditText>(Resource.Id.txtPwd);
EditText payment = FindViewById<EditText>(Resource.Id.txtPayMethod);
Button btnGetAcc = FindViewById<Button>(Resource.Id.btnGetAcc);
btnGetAcc.Click += async delegate
{
VehicleRecord vehicRec = null;
HttpClient client = new HttpClient();
string url = "http://192.168.0.135/PMSAPI/api/clients/" + username.Text.ToString();
var result = await client.GetAsync(url);
var json = await result.Content.ReadAsStringAsync();
try
{
vehicRec = Newtonsoft.Json.JsonConvert.DeserializeObject<VehicleRecord>(json);
if (vehicRec == null)
{
//check for an array just in case
var items = JsonConvert.DeserializeObject<VehicleRecord[]>(json);
if (items != null && items.Length > 0)
{
vehicRec = items[0];
}
}
}
catch (Exception ex) { }
};
}
预期的输出应该在编辑文本上显示来自SQL Server的数据,但实际输出是以JSON格式显示所有数据。
代码的逻辑是如果vehicRec == null
显示JSON。
图像中显示的JSON是数组的JSON。注意包装JSON对象的[]
方括号。
[{....}]
这意味着要求反序列化到对象将失败。重构代码以解析为数组,然后从结果中提取所需的对象。
//...omitted for brevity
var json = await result.Content.ReadAsStringAsync();
try {
vehicRec = Newtonsoft.Json.JsonConvert.DeserializeObject<VehicleRecord>(json);
if(vehicRec == null) {
//check for an array just in case
var items = JsonConvert.DeserializeObject<VehicleRecord[]>(json);
if(items != null && items.Length > 0) {
vehicRec = items[0];
}
}
}
catch (Exception ex) { }
if (vehicRec == null)
{
Toast.MakeText(this, json, ToastLength.Short).Show();
}
else
{
firstName.Text = vehicRec.firstName;
lastName.Text = vehicRec.lastName;
gen.Text = vehicRec.gender;
ic.Text = vehicRec.icNo;
address.Text = vehicRec.address;
phoneNo.Text = vehicRec.phoneNo;
username.Text = vehicRec.username;
password.Text = vehicRec.password;
payment.Text = vehicRec.paymentMethod;
}
//...omitted for brevity
另请注意,JSON中的数组中有多个项目。我建议你考虑使用列表来显示数组中的记录。
上面的代码只显示数组中的第一项,但可以很容易地重构,以将数组用作列表视图的数据源。
还注意到JSON中字段的名称与正在填充的类的名称不匹配。这将导致属性不获取任何值。
从您之前的一个问题我可以看到您将该课程定义为
public class VehicleRecord {
public string firstName { get; set; }
public string lastName { get; set; }
public string gender { get; set; }
public string icNo { get; set; }
public string address { get; set; }
public string phoneNo { get; set; }
public string email { get; set; }
public string username { get; set; }
public string password { get; set; }
public string plateNo { get; set; }
public string model { get; set; }
public string col { get; set; }
public string paymentMethod { get; set; }
}
但是图像中显示的JSON所有字段都以cl
为前缀。
您需要添加映射,以便JsonConverter知道如何填充该类
public class VehicleRecord {
[JsonProperty("clFirstName")]
public string firstName { get; set; }
[JsonProperty("clLastName")]
public string lastName { get; set; }
[JsonProperty("clGender")]
public string gender { get; set; }
//...etc
}
您可能最好使用JSON解析器为您生成类,其中还包括映射属性的属性。