C# 无法将System.String强制转换或转换为类对象

C# 无法将System.String强制转换或转换为类对象,c#,json,serialization,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.M

我正在尝试反序列化从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");
}
JSON字符串:

“\”{\\“状态\\”:\“0\”,\“消息\\”:{\\“ID\”:5、\“名字\\”:\“约翰\\”,\“姓氏\\”:\“Doe\”,\“电子邮件\\”:\”testemail@gmail.com\\“,\“密码\\”:\“测试通行证\\”,\“创建日期\\”:\“2016-10-26T15:01:08\”,\“RoleID\”: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; }
}
完整错误消息:

{”转换值时出错 \“{\'status\':\'0\',\'message\':{\'ID\':5,\'FirstName\':\'John\',\'LastName\':\'Doe\',\'Email\':\”testemail@gmail.com\“,”密码\“:”测试通行证\“,”创建日期\“:”2016-10-26T15:01:08 \“,”角色ID \“:1,\”门代码\“:9999}}” 键入“App1.apireult”。路径“”,第1行,位置232。“}


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

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

"\"{\\"status\\":\\"0\\",\\"message\\":...
调试器可能会添加第一个双引号,但第二个双引号(转义的
\“
一个)似乎确实是您正在处理的数据的一部分。错误消息也有意义,因为它反序列化
字符串
,然后尝试将其强制转换为
ApiResult

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

您的数据模型

   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);
var r=新的ApiResult
{
status=“0”,
message=新帐户()
{
status=“0”,
CreationDate=日期时间。现在,
电子邮件=”foo@foo.com",
FirstName=“特朗普”,
ID=1,
LastName=“Fck”,
Password=“111”,
RoleID=1,
门牌号码=222
}
};
var jsonResult=Newtonsoft.Json.JsonConvert.serializer对象;
var apiObject=Newtonsoft.Json.JsonConvert.DeserializeObject


要解决问题,请看这里App.client.GetUser();

下面的代码按照C.Evenhui的答案为我工作

   var content = response.Content;              
   var jsonResult = JsonConvert.DeserializeObject(content).ToString();
   var result= JsonConvert.DeserializeObject<Model>(jsonResult);
var content=response.content;
var jsonResult=JsonConvert.DeserializeObject(content.ToString();
var result=JsonConvert.DeserializeObject(jsonResult);
这里的内容类似于-
“\”{\\“Id\\”:\ \“92209\\”,\ \“operatorId\\”:100000,\“Status\\”:true,…

string r=wait App.client.GetUser();您可以选中“r”“此处为值。看起来它无法解析消息中的日期,请尝试在没有
CreationDate
的情况下解析它。结果它被序列化了两次。我没有制作API,所以我没有意识到这一点。谢谢。在我的情况下,我的ASP.NET核心服务器返回了
Ok(JsonConvert.SerializedObject(foo))
。将其更改为
Ok(foo)”
修复了双重序列化问题。
JsonConvert.DeserializeObject(JsonConvert.DeserializeObject(apiResponse))
。首先反序列化为字符串,然后反序列化为
apireult
模型类。最好的答案是最简单的答案。爱你!非常感谢!政治回答关于jsonResult..在读完JSON内容错误后,我收到了额外的文本。。。
   var content = response.Content;              
   var jsonResult = JsonConvert.DeserializeObject(content).ToString();
   var result= JsonConvert.DeserializeObject<Model>(jsonResult);