【问题标题】:Could not Cast or Convert System.String to Class object无法将 System.String 转换或转换为 Class 对象
【发布时间】:2017-04-09 20:01:53
【问题描述】:

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

但是它给出了错误:Could not Cast or Convert System.String to App1.ApiResult App.Authentication = JsonConvert.DeserializeObject&lt;ApiResult&gt;(r);

App.Authentication:

public static ApiResult Authentication = new ApiResult();`

JSON 字符串:

"\"{\\"状态\\":\\"0\\",\\"消息\\":{\\"ID\\":5,\\"FirstName\\": \\"John\\",\\"LastName\\":\\"Doe\\",\\"Email\\":\\"testemail@gmail.com\\",\\"密码\\ ":\\"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; }
}

完整的错误信息:

{"错误转换值 \"{\"状态\":\"0\",\"消息\":{\"ID\":5,\"FirstName\":\"John\",\"LastName\":\" Doe\",\"Email\":\"testemail@gmail.com\",\"Password\":\"testPass\",\"CreationDate\":\"2016-10-26T15:01:08\ ",\"RoleID\":1,\"doorCode\":9999}}\" 键入“App1.ApiResult”。路径'',第 1 行,位置 232。"}

【问题讨论】:

  • jsonformatter.curiousconcept.com string r = await App.client.GetUser();您可以在此处检查“r”值。
  • 看起来它无法从您的消息中解析日期,请尝试在没有CreationDate 的情况下解析它。

标签: c# json serialization


【解决方案1】:

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

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

第一个双引号可能是由您的调试器添加的,但第二个(转义的 \" 一个)似乎确实是您正在处理的数据的一部分。通过这种方式,错误消息也很有意义,它反序列化 string,然后尝试将其转换为 ApiResult

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

【讨论】:

  • 原来它被序列化了两次。我没有制作 API,所以我没有意识到这一点。谢谢。
  • 就我而言,我的 ASP.NET Core 服务器返回 Ok(JsonConvert.SerializeObject(foo))。将其更改为 Ok(foo) 修复了双序列化问题。
  • JsonConvert.DeserializeObject&lt;ApiResult&gt;(JsonConvert.DeserializeObject&lt;string&gt;(apiResponse))。先反序列化成字符串再反序列化为ApiResult模型类。
  • 最好的答案是最简单的。爱你!非常感谢!
【解决方案2】:

下面的代码按照 C.Evenhuis 的回答为我工作,

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

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

【讨论】:

  • 在 jsonResult 上。我在读取完 JSON 内容错误后遇到附加文本...
【解决方案3】:

您的数据模型,

   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结果:

问题看这里 App.client.GetUser();

【讨论】:

  • 政治回答
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多