无法将 System.String 转换或转换为类对象

问题描述 投票:0回答:3

我正在尝试反序列化从 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。"}

c# json serialization
3个回答
97
投票

您收到的 json 似乎已被序列化两次 - 首先从

ApiResult
string
,然后再次到
string

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

第一个双引号可能是由调试器添加的,但第二个双引号(转义的

\"
)实际上似乎是您正在处理的数据的一部分。错误消息也以这种方式有意义,它反序列化
string
,然后尝试将其转换为
ApiResult

尝试将数据反序列化为字符串,然后然后将其结果反序列化为

ApiResult
,以确保情况确实如此 - 如果是这样,则需要更改服务器代码。


27
投票

下面的代码对我有用,类似于 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,.....


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.