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

System.Text.Json反序列化币安REST API响应失败如何解决

问题核心原因

  1. 命名策略不匹配:币安接口返回的JSON为小驼峰命名(如makerCommission),而System.Text.Json默认采用严格大小写匹配,无法和你定义的大驼峰属性名对应,导致属性无法正确赋值。
  2. 数值类型转换失败:币安为了避免浮点精度丢失,所有金额、手续费类的数值都以字符串格式返回,System.Text.Json默认不支持自动将字符串转为decimal类型,会触发反序列化错误。
  3. 默认配置下反序列化出现异常不会主动抛出,只会返回默认值或null。

修复方案

第一步:配置System.Text.Json序列化选项

在BinanceRestApiClient类中添加全局静态序列化配置,兼容币安的返回格式:

private static readonly JsonSerializerOptions _binanceJsonOptions = new JsonSerializerOptions
{
    // 适配小驼峰命名
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    // 支持读取字符串格式的数值
    NumberHandling = JsonNumberHandling.AllowReadingFromString,
    // .NET 7及以上版本可开启,缺失必填字段时主动抛出异常
    MissingMemberHandling = JsonMissingMemberHandling.Error,
    // 禁用尾随逗号解析
    AllowTrailingCommas = false
};

第二步:修改反序列化逻辑,添加异常校验

修改GetBalances方法中的反序列化代码,传入上述配置,同时对反序列化结果做非空校验:

var deserialize = JsonSerializer.Deserialize<AccountInformation>(response.Content, _binanceJsonOptions);
// 反序列化结果为空时主动抛出异常
if (deserialize == null)
{
    throw new JsonException($"币安账户接口反序列化失败,响应内容:{response.Content}");
}
return deserialize;

可选优化(兼容低版本.NET)

如果你使用的.NET版本低于7,没有MissingMemberHandling配置,可以给实体类的必填字段添加[JsonRequired]特性,缺失字段时会自动抛出异常:

public class AccountInformation
{
    [JsonRequired]
    public decimal MakerCommission { get; set; }
    // 其余必填属性同理添加[JsonRequired]
}

同时建议将集合属性的IEnumerable<T>改为List<T>,减少反序列化时的类型转换开销:

public List<Balance> Balances { get; set; }
public List<string> Permissions { get; set; }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:06:04