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

43

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

"\"{\\"status\\":\\"0\\",\\"message\\":{\\"ID\\":5,\\"FirstName\\":\\"John\\",\\"LastName\\":\\"Doe\\",\\"Email\\":\\"testemail@gmail.com\\",\\"Password\\":\\"testPass\\",\\"CreationDate\\":\\"2016-10-26T15:01:08\\",\\"RoleID\\":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; }
}

完整的错误信息:

{"Error converting value \"{\"status\":\"0\",\"message\":{\"ID\":5,\"FirstName\":\"John\",\"LastName\":\"Doe\",\"Email\":\"testemail@gmail.com\",\"Password\":\"testPass\",\"CreationDate\":\"2016-10-26T15:01:08\",\"RoleID\":1,\"doorCode\":9999}}\" to type 'App1.ApiResult'. Path '', line 1, position 232."}


string r = await App.client.GetUser();您可以在此处检查“r”的值。 - go..
看起来无法从您的消息中解析日期,请尝试在不使用“CreationDate”的情况下进行解析。 - Shakra
4个回答

93

看起来你收到的 JSON 已经被序列化了两次-首先从 ApiResult 序列化为 string,然后再次序列化为 string

似乎收到的 JSON 已经被序列化了两次-首先是从 ApiResultstring,然后再次转换为 string

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

第一个双引号可能是由你的调试器添加的,但第二个(转义的 \")似乎真的是你正在处理的数据的一部分。这样错误消息也就有了意义,它将字符串反序列化,然后尝试将其转换为 ApiResult

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


4
原来它被序列化了两次。我没有编写这个API,所以我不知道这一点。谢谢。 - Supahotfire420
8
在我的情况下,我的ASP.NET Core服务器返回了 Ok(JsonConvert.SerializeObject(foo))。将其更改为 Ok(foo) 可以修复双重序列化问题。 - Alex Walker
3
将字符串反序列化成 ApiResult 模型类,需要先将其反序列化为字符串,代码如下:JsonConvert.DeserializeObject<ApiResult>(JsonConvert.DeserializeObject<string>(apiResponse)) - Adithya Upadhya
5
最好的答案总是最简单的。爱你!非常感谢! - awerdan

24

以下代码对我很有帮助,沿用了C.Evenhuis的回答。

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

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

"

1
在 jsonResult 中,我得到了“在完成读取 JSON 内容后遇到其他文本”的错误。 - Ziggler
这对我有用,谢谢。我的请求被序列化了两次,为了反序列化它,我必须先使用toString()将其转换为字符串,然后再第二次调用Jsonconvert.Deseriliaze。 - Bonyjose

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

0

你的数据模型,

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

json结果:

enter image description here

如果有问题,请看这里 App.client.GetUser();


政治答案 - emarshah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接