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

Sup*_*420 16 c# serialization json

我试图反序列化从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");
}
Run Code Online (Sandbox Code Playgroud)

但是它给出了错误:无法将System.String转换或转换为App1.ApiResult App.Authentication = JsonConvert.DeserializeObject<ApiResult>(r);

App.Authentication:

public static ApiResult Authentication = new ApiResult();`
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

账户类别:

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; }
}
Run Code Online (Sandbox Code Playgroud)

完整的错误消息:

{"转换值错误\"{\"status \":\"0 \",\"message \":{\"ID \":5,\"FirstName \":\"John \",\"LastName\":\" 李四\ "\ "电子邮件\":\ "testemail@gmail.com \",\ "密码\":\ "testPass \",\ "CreationDate \":\" 2016-10-26T15 :01:08 \",\"RoleID \":1,\"doorCode \":9999}} \"键入'App1.ApiResult'.路径'',第1行,位置232."}

C.E*_*uis 34

看来,您会收到JSON已经系列化两次-第一次从ApiResultstring,然后string再:

"\"{\\"status\\":\\"0\\",\\"message\\":...
Run Code Online (Sandbox Code Playgroud)

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

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

  • 最好的答案是最简单的答案。爱你!太感谢了! (5认同)
  • 在我的例子中,我的ASP.NET核心服务器返回````Ok(JsonConvert.SerializeObject(foo))````.把它改成````Ok(foo)````修复了双序列化问题. (3认同)
  • `JsonConvert.DeserializeObject&lt;ApiResult&gt;(JsonConvert.DeserializeObject&lt;string&gt;(apiResponse))`。首先反序列化为字符串,然后反序列化为“ApiResult”模型类。 (3认同)
  • 原来它被序列化了两次。我没有制作 API,所以我不知道这一点。谢谢你。 (2认同)

Gur*_*uru 12

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

   var content = response.Content;              
   var jsonResult = JsonConvert.DeserializeObject(content).ToString();
   var result= JsonConvert.DeserializeObject<Model>(jsonResult);
Run Code Online (Sandbox Code Playgroud)

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