在WebAPI中进行身份验证后反序列化json对象

时间:2018-11-05 22:17:24

标签: c# json deserialization

我正在向webapi 2.0“ www.someurl.com \ token”发送发布请求,如下所示-

"username": "someone@gmail.com", "password": "somepassword", "grant_type" : "password"

如果webapi可以通过身份验证,则会向我发送一个包含此字段的承载令牌-

"{\"access_token\":\"...the token...\",\"token_type\":\"bearer\",\"expires_in\":1209599,\"userName\":\"someone@gmail.com\",\".issued\":\"Mon, 05 Nov 2018 13:59:10 GMT\",\".expires\":\"Mon, 19 Nov 2018 13:59:10 GMT\"}"

我想知道是否可以直接将其反序列化为类对象,例如Json.Convert<Object Type>(data)。我总是可以使用自定义对象来执行此操作,但是我正在搜索是否可以使用某些标准类类型。

3 个答案:

答案 0 :(得分:2)

您需要问自己要使用此对象做什么?仅仅反序列化一个对象将意味着您不使用反射就无法访问任何属性,这充其量是麻烦的。而是声明一个类:

public sealed class BearerToken
{
    [JsonProperty(PropertyName = "access_token")]
    public string AccessToken { get; set; }

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

    [JsonProperty(PropertyName = "expires_in")]
    public int ExpiresInMilliseconds { get; set; }

    [JsonProperty(PropertyName = "userName")]
    public string Username { get; set; }

    [JsonProperty(PropertyName = ".issued")]
    public DateTimeOffset? IssuedOn { get; set; }

    [JsonProperty(PropertyName = ".expires")]
    public DateTimeOffset? ExpiresOn { get; set; }
}

然后,您只需执行JsonConvert.DeserializeObject<BearerToken>(data);,这将为您提供一个完整的BearerToken对象,供您使用。

请注意,这里的魔力位于JsonProperty属性中,该属性将通知转换器有关哪个字段到达何处。您还可以使用this之类的工具为您自动生成类。

答案 1 :(得分:1)

OAuth没有内置的.NET库。通常,身份提供者(IDP)提供那些强类型的库。

例如,Azure AD提供Microsoft.IdentityModel.Protocols.OpenIdConnect

namespace Microsoft.IdentityModel.Protocols.OpenIdConnect
{  
  public class OpenIdConnectMessage : AuthenticationProtocolMessage
  {
    /// <summary>
    /// Gets or sets 'access_Token'.
    /// </summary>
    public string AccessToken ...

    /// <summary>
    /// Gets or sets 'token_type'.
    /// </summary>
    public string TokenType ...

     /// <summary>
     /// Gets or sets 'expires_in'.
     /// </summary>
     public string ExpiresIn ...
  }
}

答案 2 :(得分:-1)

是的,您可以通过声明要反序列化为dynamic的变量来做到这一点

尝试一下:

dynamic value = JsonConvert.DeserializeObject<Object>("");

您将需要Newtonsoft.Json Nuget软件包

现在您可以通过以下方式简单地访问值:

Console.Writeline(value.username);

编辑:这可能不起作用,因为有些属性以'。'开头。