Estefania Hernandez
Estefania Hernandez

Reputation: 268

API GET method doesn't store data in the property in Xamarin Forms

Data is being retrieve from the API succesfully, as I can see it here, response and then goes to the jsonstring, but never gets to the CantGet variable

I need it to be store in my property so I can use the value.

This is my API return: [{"CantPremio":"70"}

Then this is my property:

using System;
using System.Collections.Generic;
using System.Text;


namespace ServLottery
{
    public class GetCantPremio
    {
        public long CantPremio { get; set; }
    }
}

This is the Get task

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;

namespace ServLottery
{
    public class RestClient
    {
        HttpClient client = new HttpClient();
        public async Task<T> Get<T>(string URL)
        {
            try
            {
                
                var response = await client.GetAsync(URL);
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    var jsonstring = await response.Content.ReadAsStringAsync();
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonstring);
                }

            }
            catch 
            {
            }
            return default(T);
        }

    }
}

Finally this is the call:

private async void GetCantDisponible()
        {
            try
            {
                RestClient client = new RestClient();
                var CantGet = await client.Get<GetCantPremio>("https://servicentroapi.azurewebsites.net/api/GetNumber");
                if (CantGet != null)
                {
                    PremiosCantLocal = CantGet.CantPremio.ToString();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

Upvotes: 1

Views: 189

Answers (3)

Wendy Zang - MSFT
Wendy Zang - MSFT

Reputation: 10978

Like kelvin said, set the List<T> for the json array. And then foreach the collection to get the CantPremio.

RestClient:

public class RestClient
{
    HttpClient client = new HttpClient();
    public async Task<List<T>> Get<T>(string URL)
    {
        try
        {

            var response = await client.GetAsync(URL);
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var jsonstring = await response.Content.ReadAsStringAsync();
                var s = Newtonsoft.Json.JsonConvert.DeserializeObject<List<T>>(jsonstring);

                return s;
            }

        }
        catch
        {
        }
        return default(List<T>);
    }

}

GetCantDisponible:

private async void GetCantDisponible()
    {
        try
        {
            RestClient client = new RestClient();
            var CantGet = await client.Get<GetCantPremio>("https://servicentroapi.azurewebsites.net/api/GetNumber");
            if (CantGet != null)
            {
                foreach (var item in CantGet)
                {
                    var PremiosCantLocal = item.CantPremio.ToString();
                }

            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

Screenshot:

enter image description here

Upvotes: 1

devNull
devNull

Reputation: 4219

As mentioned, your API is returning an array but you're trying to deserialize it to a single instance. I'd suggest changing the call site of your client to pass a list for the type parameter:

List<GetCantPremio> CantGet = await client.Get<List<GetCantPremio>>("https://servicentroapi.azurewebsites.net/api/GetNumber");

Note that CantGet is now a List. If you are only looking for one object you could just add on a FirstOrDefault():

GetCantPremio CantGet = await client.Get<List<GetCantPremio>>("https://servicentroapi.azurewebsites.net/api/GetNumber")?.FirstOrDefault();

Upvotes: 0

kelvin sand
kelvin sand

Reputation: 503

The api you are accessing is returning an array. So you must deserialize not a simple object but a list.

return Newtonsoft.Json.JsonConvert.DeserializeObject<List<T>>(jsonstring);

Replace the line that deserializes with this one. Should solve the problem

Upvotes: 3

Related Questions