简体   繁体   English

Json 反序列化表示儿童无法评估 - xamarin.forms

[英]Json deserialize says children could not evaluate- xamarin.forms

I have xamarin.forms app in which I am trying to consume an API.我有 xamarin.forms 应用程序,我试图在其中使用 API。 I can get the results but cant deserialize the data.我可以得到结果,但不能反序列化数据。 It says " Childern could not be evaluated "它说“无法评估 Childern

My Json data我的 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"
 }

My Corresponding C# class我对应的 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; }
}
}

My common class for making API call我的 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;
            }

        }

How I am making API call我如何进行 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");
                        }

How to solve this issue?如何解决这个问题? Is this something related to mapping of data to my model class?Any help is appriciated.这与将数据映射到我的模型类有关吗?有任何帮助。

You need to use RootObject for the deserialization.您需要使用RootObject进行反序列化。

Change this line of code更改这行代码

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM