我正在向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)
。我总是可以使用自定义对象来执行此操作,但是我正在搜索是否可以使用某些标准类类型。
答案 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);
编辑:这可能不起作用,因为有些属性以'。'开头。