如何使用Web API在Xamarin.Android编辑文本上显示数据

问题描述 投票:0回答:1

我正在尝试使用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格式显示所有数据。

实际输出: The actual output

c# visual-studio asp.net-web-api xamarin.android android-edittext
1个回答
0
投票

代码的逻辑是如果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解析器为您生成类,其中还包括映射属性的属性。

© www.soinside.com 2019 - 2024. All rights reserved.