【问题标题】:Deserializing Json can't convert string to object using NewtonSoft反序列化 Json 无法使用 NewtonSoft 将字符串转换为对象
【发布时间】:2018-04-28 04:33:20
【问题描述】:
{
  "access_token":"asfdasfdsf",
  "token_type":"bearer",
  "expires_in":15179999,
  "refresh_token":"sdsfsf",
  ".issued":"Sat, 28 Apr 2018 03:05:12 GMT",
  ".expires":"Sat, 20 Oct 2018 19:45:12 GMT",
  "ip_address":"111.111.11.1",
  "client_id":"asdsdfsf",
  "user":"{\r\n \"Active\": true,\r\n \"DisplayName\": \"Sakib Hasan\",\r\n \"Email\": \"test@testc.om\",\r\n \"EmailVarified\": true,\r\n \"Language\": \"en-US\",\r\n \"PhoneNumber\": null,\r\n \"ProfileImageUrl\": null,\r\n \"Roles\": [\r\n \"anonymous\",\r\n \"admin\"\r\n ],\r\n \"TenantId\": \"asfsf\",\r\n \"UserName\": \"test@testc.com\",\r\n \"FirstName\": null,\r\n \"UserSignup\": false,\r\n \"ProfileImageId\": null,\r\n \"EverLoggedIn\": true,\r\n \"PersonIdentifier\": null,\r\n \"UserId\": \"sdfsff\"\r\n}",
  "may_access":""
}

我正在尝试将上述字符串反序列化为我的 C# 对象。我的课程如下所示

internal class TokenResponse
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [JsonProperty("token_type")]
    public string TokenType { get; set; }

    [JsonProperty("refresh_token")]
    public string RefreshToken { get; set; }

    [JsonProperty("client_id")]
    public string ClientId { get; set; }

    [JsonProperty("user")]
    public TokenUser User { get; set; }
}

internal class TokenUser
{
    [JsonProperty("DisplayName")]
    public string DisplayName { get; set; }

    [JsonProperty("Email")]
    public string Email { get; set; }

    [JsonProperty("ProfileImageUrl")]
    public string ProfileImageUrl { get; set; }

    [JsonProperty("UserName")]
    public string UserName { get; set; }

    [JsonProperty("FirstName")]
    public string FirstName { get; set; }

    [JsonProperty("UserId")]
    public string UserId { get; set; }
}

现在当我尝试使用 Newtonsoft 反序列化时

tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(jsonTokenResponse);

我得到无法将字符串转换为用户的错误。我在这里遗漏了什么吗?

【问题讨论】:

  • 你确定这个 JSON 没有格式错误?
  • @TanveerBadar 是合法的json,可以在线查看

标签: c# json json.net


【解决方案1】:

这样试试,

internal class TokenResponse
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [JsonProperty("token_type")]
    public string TokenType { get; set; }

    [JsonProperty("refresh_token")]
    public string RefreshToken { get; set; }

    [JsonProperty("client_id")]
    public string ClientId { get; set; }

    [JsonProperty("user")]
    public string User { get; set; }

    [JsonIgnore]
    public TokenUser UserToken { get; set; }

}



internal class TokenUser
{
    [JsonProperty("DisplayName")]
    public string DisplayName { get; set; }

    [JsonProperty("Email")]
    public string Email { get; set; }

    [JsonProperty("ProfileImageUrl")]
    public string ProfileImageUrl { get; set; }

    [JsonProperty("UserName")]
    public string UserName { get; set; }

    [JsonProperty("FirstName")]
    public string FirstName { get; set; }

    [JsonProperty("UserId")]
    public string UserId { get; set; }
}


tokenResponse = JsonConvert.DeserializeObject<TokenResponse>(jsonTokenResponse);
tokenResponse.UserToken = JsonConvert.DeserializeObject<TokenUser>(tokenResponse);

因为您的用户属性在期望 TokenUser 时得到一个字符串

【讨论】:

  • 我不想忽略它。我想要用户数据
  • @Akbar Badhusha 告诉你错误在哪里。至少他引导你去解决它,并且他向你展示了一个可能的解决方案(不是唯一的)。也许他应该得到一些东西......
【解决方案2】:

回答以供将来参考。

问题在于 Json 本身。它将“用户”视为字符串并且没有转换为用户对象。所以我必须清理它,以便 DeSerializer(ds) 知道它是一个对象。

json2csharp 帮助我确定了问题所在。如果你把上面的 Json 放在里面,它会创建一个带有字符串属性的类。

清理后jsonformatter是一个很好的验证清理后的版本是否仍然是好的json。

【讨论】:

猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多