You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord认证AccessToken返回null(状态码200)问题排查求助

Discord OAuth2反序列化AccessTokenResponse时字段为null的解决方法

问题核心

接口返回200状态码,JSON响应明确包含access_token字段,但使用System.Text.Json反序列化到AccessTokenResponse模型后,AccessToken等字段始终为null。

原因分析

.NET内置的System.Text.Json默认采用PascalCase(大驼峰)命名映射规则,而Discord OAuth2接口返回的JSON字段是snake_case(下划线分隔命名),比如JSON中的access_token与模型中的AccessToken命名格式不匹配,导致反序列化器无法识别对应字段,最终赋值为null。

解决方案

方案1:给模型字段添加JsonPropertyName特性

直接在模型的每个字段上标注对应的JSON字段名,实现精准映射:

using System.Text.Json.Serialization;

public class AccessTokenResponse
{
    [JsonPropertyName("access_token")]
    public string AccessToken { get; set; }
    [JsonPropertyName("expires_in")]
    public int ExpiresIn { get; set; }
    [JsonPropertyName("refresh_token")]
    public string RefreshToken { get; set; }
    [JsonPropertyName("scope")]
    public string Scope { get; set; }
    [JsonPropertyName("token_type")]
    public string TokenType { get; set; }
}

方案2:反序列化时指定SnakeCase命名策略

如果不想修改模型,可以在反序列化时配置JsonSerializerOptions,统一适配snake_case格式:

var json = await response.Content.ReadAsStringAsync();
var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
    PropertyNameCaseInsensitive = true // 可选,忽略大小写增强兼容性
};
var accessTokenResponse = JsonSerializer.Deserialize<AccessTokenResponse>(json, options);

验证建议

反序列化前可以先打印JSON字符串,确认响应内容符合预期:

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json); // 确认包含access_token等字段

内容的提问来源于stack exchange,提问作者Berkay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:49