Как отображать данные на Xamarin.Android редактировать текст с помощью веб-API - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь отобразить данные с сервера SQL с помощью веб-API, получить метод редактирования текста в Xamarin.Android. Данные будут отображаться в редактируемом тексте после нажатия кнопки. Я выполнил все шаги (точно), как в учебнике YouTube, но, к сожалению, данные не отображаются в тексте редактирования, вместо этого он показывает формат JSON на экране. Что я должен сделать, чтобы решить эту проблему?

Я пытался использовать веб-сервисы, но все еще не появлялся.

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 при редактировании текста, но на самом деле выводит все данные в формате JSON.

Фактический объем производства:
The actual output

1 Ответ

0 голосов
/ 20 апреля 2019

Логика вашего кода состоит в том, чтобы показать JSON, если vehicRec == null.

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-анализаторсоздать класс для вас, который также будет включать атрибуты для сопоставления свойств.

...