我正在尝试反序列化从 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);
应用程序身份验证:
public static ApiResult Authentication = new ApiResult();`
JSON 字符串:
"\"{\"状态\":\"0\",\"消息\":{\"ID\":5,\"名字\":\"约翰\",\"姓氏\": \“Doe\”,\“电子邮件\”:\“[电子邮件受保护]\”,\“密码\”:\“testPass \”,\“创建日期\”:\“2016-10-26T15:01 :08\",\"角色ID\":1,\"门码\":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,\"名字\":\"约翰\",\"姓氏\":\" Doe\",\"电子邮件\":\"[电子邮件受保护]\",\"密码\":\"testPass\",\"创建日期\":\"2016-10-26T15:01:08 \",\"角色ID\":1,\"门码\":9999}}\" 输入“App1.ApiResult”。路径 '',第 1 行,位置 232。"}
您收到的 json 似乎已被序列化两次 - 首先从
ApiResult
到 string
,然后再次到 string
:
"\"{\\"status\\":\\"0\\",\\"message\\":...
第一个双引号可能是由调试器添加的,但第二个双引号(转义的
\"
)实际上似乎是您正在处理的数据的一部分。错误消息也以这种方式有意义,它反序列化 string
,然后尝试将其转换为 ApiResult
。
尝试将数据反序列化为字符串,然后然后将其结果反序列化为
ApiResult
,以确保情况确实如此 - 如果是这样,则需要更改服务器代码。
下面的代码对我有用,类似于 C.Evenhuis 的答案,
var content = response.Content.ReadAsStringAsync().Result;
var jsonResult = JsonConvert.DeserializeObject(content).ToString();
var result= JsonConvert.DeserializeObject<Model>(jsonResult);
这里的内容类似于 - ""{\"Id\":\"92209\",\"operatorId\":100000,\"Status\":true,.....
尝试使用 App.Authentication = JObject.Parse(request.Content.ReadAsStringAsync().Result);