.NET 8 Web API如何返回无引号的BigInteger类型大数字
解决.NET 8 Web API返回无引号大数字的问题
问题核心
.NET默认的System.Text.Json序列化器对System.Numerics.BigInteger的处理逻辑不符合需求:
- 返回字符串形式的大数字会带引号
- 直接返回
BigInteger类型会被序列化为包含Sign、Bits等属性的对象集合
要实现返回无引号的纯数字格式,需要自定义JSON转换器来处理BigInteger的序列化逻辑。
具体实现步骤
1. 自定义BigInteger JSON转换器
创建一个继承自JsonConverter<BigInteger>的转换器类,手动控制序列化和反序列化行为:
using System.Numerics; using System.Text.Json; using System.Text.Json.Serialization; public class BigIntegerJsonConverter : JsonConverter<BigInteger> { // 反序列化:支持解析字符串或数字格式的BigInteger public override BigInteger Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType switch { JsonTokenType.String => BigInteger.Parse(reader.GetString()!), JsonTokenType.Number => reader.TryGetInt64(out long num) ? num : BigInteger.Parse(reader.GetString()!), _ => throw new JsonException("无法将当前JSON值解析为BigInteger类型") }; } // 序列化:直接输出数字字符串(不带引号,JSON解析器会识别为数值类型) public override void Write(Utf8JsonWriter writer, BigInteger value, JsonSerializerOptions options) { writer.WriteRawValue(value.ToString()); } }
2. 注册转换器
有两种注册方式可选:
方式一:全局注册(对所有控制器生效)
在Program.cs中配置JSON序列化选项:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { // 添加自定义转换器 options.JsonSerializerOptions.Converters.Add(new BigIntegerJsonConverter()); }); var app = builder.Build(); app.MapControllers(); app.Run();
方式二:局部注册(仅对指定属性/模型生效)
在模型属性上标注转换器:
using System.Numerics; using System.Text.Json.Serialization; public class SupplyDto { [JsonConverter(typeof(BigIntegerJsonConverter))] public BigInteger TotalSupply { get; set; } }
3. 编写API接口
现在直接返回BigInteger类型即可得到无引号的纯数字结果:
using Microsoft.AspNetCore.Mvc; using System.Numerics; [ApiController] [Route("api/[controller]")] public class SupplyController : ControllerBase { [HttpGet("GetSupply")] public IActionResult GetSupply() { var bigNumber = BigInteger.Parse("9474488248131986559259619"); return Ok(bigNumber); } [HttpGet("GetSupply2")] public BigInteger GetSupply2() { return BigInteger.Parse("9474488248131986559259619"); } }
注意事项
如果前端使用JavaScript处理超大数字(超过2^53),会出现精度丢失问题,这是JavaScript的语言限制,后端已正确返回完整数值,前端可通过字符串解析来避免精度问题。
内容的提问来源于stack exchange,提问作者Iaman Swtrse
相关产品推荐
相关产品推荐

