Я пытаюсь десериализовать строку JSON, полученную из веб-API

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");
}

Однако это дает ошибку: не удалось преобразовать System.String в App1.ApiResult. App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r);

Приложение Аутентификация:

public static ApiResult Authentication = new ApiResult();`

Строка JSON:

"\" {\\ "status \\": \\ "0 \\", \\ "message \\": {\\ "ID \\": 5, \\ "FirstName \\": \\ " Джон \\ ", \\" Фамилия \\ ": \\" Doe \\ ", \\" Электронная почта \\ ": \\" testemail@gmail.com \\ ", \\" Пароль \\ ": \ \ "testPass \\", \\ "CreationDate \\": \\ "2016-10-26T15: 01: 08 \\", \\ "RoleID \\": 1, \\ "doorCode \\": 9999 }} \ ""

Класс ApiResult:

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

Класс учетной записи:

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; }
}

Полное сообщение об ошибке:

{"Ошибка преобразования значения \" {\ "status \": \ "0 \", \ "message \": {\ "ID \": 5, \ "FirstName \": \ "John \", \ "LastName \ ": \" Doe \ ", \" Email \ ": \" testemail@gmail.com \ ", \" Пароль \ ": \" testPass \ ", \" CreationDate \ ": \" 2016-10-26T15 : 01: 08 \ ", \" RoleID \ ": 1, \" doorCode \ ": 9999}} \" для ввода 'App1.ApiResult'. Path '', строка 1, позиция 232. "}

30
Supahotfire420 25 Ноя 2016 в 15:02

4 ответа

Лучший ответ

Похоже, что полученный вами json был сериализован дважды - сначала с ApiResult на string, затем снова на string:

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

Первая двойная кавычка может быть добавлена вашим отладчиком, но вторая (экранированная \") действительно кажется частью данных, которые вы обрабатываете. Сообщение об ошибке также имеет смысл, оно десериализует string и затем пытается преобразовать его в ApiResult.

Попробуйте десериализовать данные в виде строки и затем десериализовать результат в ApiResult, чтобы убедиться, что это так, и если да, то необходимо будет изменить код сервера.

50
C.Evenhuis 25 Ноя 2016 в 12:16

Код ниже работал у меня в соответствии с ответом C.Evenhuis,

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

Здесь Контент похож на - "\" {\\ "Id \\": \\ "92209 \\", \\ "operatorId \\": 100000, \\ "Status \\": true, .... .

8
Gurunadh Duvvuru 13 Сен 2019 в 22:00

Ваша модель данных,

   var r = new ApiResult
            {
                status = "0",
                message = new Account()
                {
                    status = "0",
                    CreationDate = DateTime.Now,
                    Email = "foo@foo.com",
                    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

Проблему смотрите здесь App.client.GetUser ();

1
go.. 25 Ноя 2016 в 12:17

Попробуйте использовать App.Authentication = JObject.Parse (request.Content.ReadAsStringAsync (). Result);

-1
Satya Prakash 25 Ноя 2016 в 12:11