Json десериализация говорит, что дети не могли оценить- xamarin.forms - PullRequest
0 голосов
/ 02 марта 2020

У меня есть приложение xamarin.forms, в котором я пытаюсь использовать API. Я могу получить результаты, но не могу десериализовать данные. Там написано: " Дитя не может быть оценено "

Мои Json данные

{
        "success": true,
        "user": {
            "auth_uuid": "52320",      
            "current_store": 9,
            "permissions": {
                "write_notifications": true,           
            },
            "has_accepted_mobile_one_terms": false,
            "store": {
                "id": 9,
                "name": "South Street",
                "number": "0009",          
            }
        },
        "message": "User Logged In",
        "sidebarItems": [
            {
                "id": 53,
                "name": "Notification Center",

            }
        ],
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
 }

Мой соответствующий класс C#

public clas loginData
{

public class Permissions
{
    public bool write_notifications { get; set; }
}

public class Store
{
    public int id { get; set; }
    public string name { get; set; }
    public string number { get; set; }
}

public class User
{
    public string auth_uuid { get; set; }
    public int current_store { get; set; }
    public Permissions permissions { get; set; }
    public bool has_accepted_mobile_one_terms { get; set; }
    public Store store { get; set; }
}

public class SidebarItem
{
    public int id { get; set; }
    public string name { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public User user { get; set; }
    public string message { get; set; }
    public List<SidebarItem> sidebarItems { get; set; }
    public string token { get; set; }
}
}

Мой общий класс для выполнения вызовов API

   public class APICall
        {
            Uri baseAddress = new Uri(CommonValues.BaseURL);
            string apiurl;
            string postdata;  
            public ErrorMessageData errorMessage;

            public APICall(string apiurl, string postdata)
            {
                this.apiurl = apiurl;
                this.postdata = postdata;
                this.loadingIndicator = loadingIndicator;
                errorMessage = null;
            }
            public T APICallResult<T>()
            {
                try
                {             
                    var client = new HttpClient { BaseAddress = baseAddress };
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    var req = new HttpRequestMessage(HttpMethod.Post, apiurl);
                    req.Content = new StringContent(postdata, Encoding.UTF8, "application/json");
                    string stringObtained = "";
                    Task<string> task = Task.Run(async () => await Threading(client, req));
                    task.Wait();
                    stringObtained = task.Result;
                    var jsonObtained = Regex.Unescape(stringObtained);         
                    var resultJSON = '[' + jsonObtained + ']';
                    T resultObject;//Generic type object
                    try
                    {
                        resultObject = JsonConvert.DeserializeObject<T>(resultJSON);        
                        return resultObject;
                    }
                    catch (Exception)
                    {
                        List<ErrorMessageData> errorMessages = JsonConvert.DeserializeObject<List<ErrorMessageData>>(resultJSON);
                        errorMessage = errorMessages[0];

                        return default(T);
                    }
                }
                catch (Exception e)
                {
                    errorMessage = new ErrorMessageData();
                    errorMessage.Flag = false;
                    errorMessage.Message = e.Message;

                    return default(T);
                }
            }
            async Task<string> Threading(HttpClient client, HttpRequestMessage req)
            {
                var resp = await client.SendAsync(req);
                resp.EnsureSuccessStatusCode();
                string stringObtained = await resp.Content.ReadAsStringAsync();
                return stringObtained;
            }

        }

Как я выполняю вызов API

 ObservableCollection<loginData> AuthDataObj;


                        string postdataForAuth = "{\"email\":\"" + "sample@sam.com" + "\",\"password\":\"" + "1234" + "\"}";
                        NCAPICall callForAuth = new APICall("/auth/login", postdataForAuth, null);
                        try
                        {
                            AuthDataObj = callForAuth.APICallResult<ObservableCollection<loginData>>();

                        }
                        catch (Exception ex)
                        {
                            await DisplayAlert("Error", ex.Message, "ok");
                        }

Как решить эту проблему? Связано ли это с отображением данных в моем классе моделей? Любая помощь ценится.

1 Ответ

1 голос
/ 02 марта 2020

Вам необходимо использовать RootObject для десериализации.

Изменить эту строку кода

var AuthDataObj = callForAuth.APICallResult<ObservableCollection<RootObject>>();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...