我的JSON字符串
{
"AccessToken":"myAccessToken",
"TokenType":"Bearer",
"ExpiresInSeconds":"3600",
"RefreshToken":"myRefreshToken",
"Scope":"myScopes",
"Issued":"05/07/2019 16:51:53",
"IssuedUtc":"05/07/2019 14:51:53"
}
我正在使用的对象类(Google API TokenResponse
类)
public class TokenResponse
{
public string AccessToken { get; set; }
public string TokenType { get; set; }
public long? ExpiresInSeconds { get; set; }
public string RefreshToken { get; set; }
public string Scope { get; set; }
public string IdToken { get; set; }
public DateTime Issued { get; set; }
public DateTime IssuedUtc { get; set; }
}
我正在使用Json.NET将JSON字符串转换为这样的对象
string jsonToken = await System.IO.File.ReadAllTextAsync(pathJsonToken);
TokenResponse token = JsonConvert.DeserializeObject<TokenResponse>(jsonToken);
jsonToken
值是我上面写的JSON字符串,当转换为TokenResponse
时,仅填充字段Issued
,IssuedUtc
和Scope
。>
起初,我认为错误是由缺少字段IdToken
引起的,但是我尝试使用由我定义的类,该类与Google的TokenResponse
相同,并且它传递了所有值(除了IdToken
以外。)
我想做的是使用现有的类,但是我无法使其正常工作。
我想念什么?
答案 0 :(得分:1)
您在问题中显示的TokenResponse
类可与您提供的JSON配合使用。 (演示here)
现在来看一下source code(针对相同类别的Google版本)。这是精简版:
public class TokenResponse
{
[Newtonsoft.Json.JsonPropertyAttribute("access_token")]
public string AccessToken { get; set; }
[Newtonsoft.Json.JsonPropertyAttribute("token_type")]
public string TokenType { get; set; }
[Newtonsoft.Json.JsonPropertyAttribute("expires_in")]
public Nullable<long> ExpiresInSeconds { get; set; }
[Newtonsoft.Json.JsonPropertyAttribute("refresh_token")]
public string RefreshToken { get; set; }
[Newtonsoft.Json.JsonPropertyAttribute("scope")]
public string Scope { get; set; }
[Newtonsoft.Json.JsonPropertyAttribute("id_token")]
public string IdToken { get; set; }
[Obsolete("Use IssuedUtc instead")]
[Newtonsoft.Json.JsonPropertyAttribute(Order = 1)]
public DateTime Issued
{
get { return IssuedUtc.ToLocalTime(); }
set { IssuedUtc = value.ToUniversalTime(); }
}
[Newtonsoft.Json.JsonPropertyAttribute(Order = 2)]
public DateTime IssuedUtc { get; set; }
...
}
现在应该清楚问题出在哪里:他们的类期望的JSON属性名称与您使用的JSON属性名称不同。 JSON应该如下所示:
{
"access_token": "myAccessToken",
"token_type": "Bearer",
"expires_in": "3600",
"refresh_token": "myRefreshToken",
"scope": "myScopes",
"Issued": "05/07/2019 16:51:53",
"IssuedUtc": "05/07/2019 14:51:53"
}
此响应格式在section 5.1 of the OAuth 2.0 Spec(RFC 6749)中有详细记录。但请注意,规范仅定义了前五个属性; Issued
和IssuedUtc
似乎是Google添加的额外属性(在代码中前者已过时)。
这是一个使用正确的JSON和Google的TokenResponse
类的演示示例:
https://dotnetfiddle.net/2wXojV