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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:57:22