将JSON字符串(无null值)转换为Google的OAuth API TokenResponse类时为空字段值

时间:2019-07-06 10:29:37

标签: c# json.net google-oauth2

我的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时,仅填充字段IssuedIssuedUtcScope

起初,我认为错误是由缺少字段IdToken引起的,但是我尝试使用由我定义的类,该类与Google的TokenResponse相同,并且它传递了所有值(除了IdToken以外。)

我想做的是使用现有的类,但是我无法使其正常工作。

我想念什么?

1 个答案:

答案 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)中有详细记录。但请注意,规范仅定义了前五个属性; IssuedIssuedUtc似乎是Google添加的额外属性(在代码中前者已过时)。

这是一个使用正确的JSON和Google的TokenResponse类的演示示例: https://dotnetfiddle.net/2wXojV