System.Text.Json反序列化币安REST API响应失败如何解决
问题核心原因
- 命名策略不匹配:币安接口返回的JSON为小驼峰命名(如
makerCommission),而System.Text.Json默认采用严格大小写匹配,无法和你定义的大驼峰属性名对应,导致属性无法正确赋值。 - 数值类型转换失败:币安为了避免浮点精度丢失,所有金额、手续费类的数值都以字符串格式返回,System.Text.Json默认不支持自动将字符串转为
decimal类型,会触发反序列化错误。 - 默认配置下反序列化出现异常不会主动抛出,只会返回默认值或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
相关产品推荐
相关产品推荐

