private MailChimpTokenInfo(JObject obj) : base(obj) {
     AccessToken = obj.GetString("access_token");
     ExpiresIn = obj.GetDouble("expires_in", TimeSpan.FromSeconds);
 }
 private SpotifyToken(JObject obj) : base(obj) {
     AccessToken = obj.GetString("access_token");
     TokenType = obj.GetString("token_type");
     ExpiresIn = obj.GetDouble("expires_in", TimeSpan.FromSeconds);
     RefreshToken = obj.GetString("refresh_token");
 }
        /// <summary>
        /// Parses the specified <code>obj</code> into an instance of <see cref="MicrosoftTokenResponseBody"/>.
        /// </summary>
        /// <param name="obj">The instance of <see cref="JObject"/> to be parsed.</param>
        /// <returns>Returns an instance of <see cref="MicrosoftTokenResponseBody"/>.</returns>
        public static MicrosoftTokenResponseBody Parse(JObject obj) {
            
            if (obj == null) return null;

            // Convert the "scope" string to a collection of scopes
            MicrosoftScopeCollection scopes = new MicrosoftScopeCollection();
            foreach (string name in obj.GetString("scope").Split(' ')) {
                MicrosoftScope scope = MicrosoftScope.GetScope(name) ?? MicrosoftScope.RegisterScope(name);
                scopes.Add(scope);
            }

            // Parse the rest of the response
            return new MicrosoftTokenResponseBody(obj) {
                TokenType = obj.GetString("token_type"),
                ExpiresIn = obj.GetDouble("expires_in", TimeSpan.FromSeconds),
                Scope = scopes,
                AccessToken = obj.GetString("access_token"),
                AuthenticationToken = obj.GetString("authentication_token"),
                RefreshToken = obj.GetString("refresh_token")
            };
        
        }