web-dev-qa-db-fra.com

C # n'a pas pu convertir ou convertir System.String en objet de classe

J'essaie de désérialiser une chaîne JSON reçue d'une API Web

try
{
    string r = await App.client.GetUser();

    App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r);

    await DisplayAlert("TEST", App.Authentication.ToString(), "OK");

    Application.Current.MainPage = new Schedule();
}
catch (Exception p)
{
    await DisplayAlert("Getting Authentication failed", p.ToString(), "TEST");
}

Cependant, il donne l'erreur: impossible de convertir ou de convertir System.String en App1.ApiResult App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r);

Authentification de l'application:

public static ApiResult Authentication = new ApiResult();`

Chaîne JSON:

"\" {\\ "status \\": \\ "0 \\", \\ "message \\": {\\ "ID \\": 5, \\ "FirstName \\": \\ " John \\ ", \\" LastName \\ ": \\" Doe \\ ", \\" Email \\ ": \\" [email protected] \\ ", \\" Password \\ ":\\ "testPass \\", \\ "CreationDate \\": \\ "2016-10-26T15: 01: 08 \\", \\ "RoleID \\": 1, \\ "doorCode \\": 9999 }}\""

Classe ApiResult:

public class ApiResult
{
    public string status { get; set; }
    public Account message { get; set; }
}

Classe de compte:

public class Account
{
    public string status { get; set; }
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public DateTime CreationDate { get; set; }
    public int RoleID { get; set; }
    public int doorCode { get; set; }
}

Le message d'erreur complet:

{"Erreur lors de la conversion de la valeur \" {\ "status \":\"0 \",\"message \": {\ "ID \": 5,\"FirstName \":\"John \",\"LastName\": \" Doe\", \" Email\": \" [email protected]\", \" Password\": \" testPass\", \" CreationDate\": \" 2016-10-26T15 : 01: 08\", \" RoleID\": 1, \" doorCode\": 9999}} \" pour taper 'App1.ApiResult'. Chemin '', ligne 1, position 232. "}

14
Supahotfire420

Il semble que le json que vous recevez ait été sérialisé deux fois - d'abord de ApiResult à string, puis à string:

"\"{\\"status\\":\\"0\\",\\"message\\":...

Le premier guillemet double peut être ajouté par votre débogueur, mais le second (le \" Échappé) semble vraiment faire partie des données que vous traitez. Le message d'erreur est également logique de cette façon, il désérialise un string puis tente de le convertir en un ApiResult.

Essayez de désérialiser les données sous forme de chaîne et puis de désérialiser son résultat en ApiResult, pour être sûr que c'est le cas - et si c'est le cas , le code du serveur devra être modifié.

32
C.Evenhuis

votre modèle de données,

   var r = new ApiResult
            {
                status = "0",
                message = new Account()
                {
                    status = "0",
                    CreationDate = DateTime.Now,
                    Email = "[email protected]",
                    FirstName = "Trump",
                    ID = 1,
                    LastName = "Fck",
                    Password = "111",
                    RoleID = 1,
                    doorCode = 222
                }
            };


var jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(r);

var apiObject = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResult>(jsonResult);

jsonResult:

enter image description here

au problème, regardez ici App.client.GetUser ();

1
Sinan BARAN

Le code ci-dessous a fonctionné pour moi dans le sens de la réponse de C.Evenhuis,

   var content = response.Content;              
   var jsonResult = JsonConvert.DeserializeObject(content).ToString();
   var result= JsonConvert.DeserializeObject<Model>(jsonResult);

Ici, le contenu est similaire à - "\" {\\ "Id \\": \\ "92209 \\", \\ "operatorId \\": 100000, \\ "Status \\": true, .... .

1
Gurunadh D