C#无法将System.String转换或转换为Class对象

时间:2016-11-25 12:02:35

标签: c# json serialization

我正在尝试反序列化从Web API接收的JSON字符串

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

App.Authentication:

public static ApiResult Authentication = new ApiResult();`

JSON字符串:

  

“\”{\\ “状态\\”:\\ “0 \\”,\\ “消息\\”:{\\ “ID \\”:5,\\ “姓\\”: \\ “约翰\\”,\\ “名字\\”:\\ “李四\\”,\\ “电子邮件\\”:\\ “testemail@gmail.com \\”,\\“密码\\ “:\\” testPass \\ “\\ ”CreationDate \\“:\\ ”2016-10-26T15:01:08 \\“,\\ ”角色ID \\“: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; }
}

完整的错误消息:

  

{“转换值时出错   \ “{\” 状态\ “:\” 0 \ “\ ”消息\“:{\ ”ID \“:5,\ ”姓\“:\ ”约翰\“ \ ”名字\“:\”李四\ “\ ”电子邮件\“:\ ”testemail@gmail.com \“,\ ”密码\“:\ ”testPass \“,\ ”CreationDate \“:\” 2016-10-26T15:01:08 \ “\ ”角色ID \“:1,\ ”doorCode \“:9999}} \”   输入'App1.ApiResult'。路径'',第1行,第232位。“}

4 个答案:

答案 0 :(得分:28)

您收到的json似乎已被序列化两次 - 首先从ApiResultstring,然后再次到string

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

您的调试器可能会添加第一个双引号,但第二个(引用的\")实际上似乎是您正在处理的数据的一部分。错误消息也是有意义的,它反序列化string,然后尝试将其转换为ApiResult

尝试将数据反序列化为字符串,然后将其结果反序列化为ApiResult,以确保是这种情况 - 如果是这样,则需要更改服务器代码

答案 1 :(得分:3)

下面的代码按照C.Evenhuis的答案对我有用,

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

这里的内容类似于-     “ \” {\\“ Id \\”:\\“ 92209 \\”,\\“ operatorId \\”:100000,\\“ Status \\”:true,.....

答案 2 :(得分:1)

您的数据模型,

   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();

答案 3 :(得分:-1)

尝试使用App.Authentication = JObject.Parse(request.Content.ReadAsStringAsync()。Result);