我的项目运行在.NET8上,并且使用VS2022模板"ASP.NET Core Web API"作为起点.

给定以下代码和application/json作为内容类型:

using Microsoft.AspNetCore.Mvc;
using System.Numerics;

namespace MyService.Controllers
{
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class MyController : ControllerBase
    {
        private readonly ILogger<MyController > _logger;

        public MyController (ILogger<MyController > logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public string GetSupply()
        {
            return "9474488248131986559259619";
        }

        [HttpGet]
        public BigInteger GetSupply2()
        {
            return BigInteger.Parse("9474488248131986559259619");
        }
    }
}

GetSupply的调用按预期工作,响应正文包含

"9474488248131986559259619"

但是,由于这代表一个数字,我想go 掉引号,这样响应将如下所示:

9474488248131986559259619

因为我不知道这个数字会有多大,所以我使用System.Numerics.BigInteger.

GetSupply2正在返回此数据类型,但它会导致以下响应

{
  "isPowerOfTwo": false,
  "isZero": false,
  "isOne": false,
  "isEven": false,
  "sign": 1
}

这不是我的本意.

那么,我如何才能做到这一点呢?

推荐答案

根据@Guru Stron人的回复,我创建了自己的解决方案.因为答案不包括夸张的用户界面.确实提出了更多的问题,我会解决这些问题,但其中一半是与大摇大摆有关的.如果您不关心swagger,而只关心http响应,那么提供的答案@Guru Stron是非常好的.

我用来回答的控制器看起来像

using Microsoft.AspNetCore.Mvc;
using System.Numerics;

namespace DfxBackendService.Controllers
{
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class StagingController : ControllerBase
    {
        private readonly ILogger<StagingController> _logger;

        public StagingController(ILogger<StagingController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public BigInteger GetGmxSupply()
        {
            return BigInteger.Parse("9474488248131986559259619");
        }

        [HttpPost]
        public bool PostGmxSupply(BigInteger value) 
        {
            return value == BigInteger.Parse("9474488248131986559259619");
        }
    }
}

出于好奇,我编写了包含Read函数的有效实现的转换器.

using System.Globalization;
using System.Numerics;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace DfxBackendService.JsonConverter
{
    public class BigIntegerConverter : JsonConverter<BigInteger>
    {
        public override BigInteger Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) 
            => BigInteger.Parse(reader.GetString()!, NumberStyles.Integer, NumberFormatInfo.InvariantInfo);

        public override void Write(Utf8JsonWriter writer, BigInteger value, JsonSerializerOptions options) 
            => writer.WriteRawValue(value.ToString(NumberFormatInfo.InvariantInfo));

        public override bool CanConvert(Type typeToConvert) 
            => typeof(BigInteger).IsAssignableFrom(typeToConvert);
    }
}

为了使用我添加的转换器,

builder.Services.Configure<JsonOptions>(options =>
{
    options.JsonSerializerOptions.Converters.Add(new BigIntegerConverter());
});

进入Program.cs.因为我不使用最小的API,这是唯一需要的.

从这里开始,http响应是正确的,正如预期的那样. 然而,确实有几件事冒了出来.

与转换器相关的问题是,当调用POST方法BigIntegerConverter时不使用.例如,在浏览器中使用https://localhost:7140/api/Staging/PostGmxSupply?value=9474488248131986559259619或使用SWAGGER UI.读函数没有被调用,相反,我直接在控制器的PostGmxSupply函数中结束.该值被正确解析,对于给定的示例,结果为true.所以这不是什么大问题,我只是想知道为什么.为了解决这个问题,我还在转换器中添加了CanConvert功能,但没有任何效果.

但是我遇到了两个与swagger有关的问题. 先说简单的.Biggram并没有被呈现为数字,而是被呈现为对象. 所以我把第builder.Services.AddSwaggerGen();行改成了

builder.Services.AddSwaggerGen(options =>
{
    options.MapType<BigInteger>(() => new Microsoft.OpenApi.Models.OpenApiSchema { Type = "integer" });
});

然后正确显示swagger.json中的模式数据.

第二个问题是我没有找到解决方案的东西.Savagger用户界面将给定的数字转换为科学格式.因此,Savagger用户界面显示的不是9474488248131986559259619,而是9.474488248131986e+24,而我没有找到解决这个问题的方法.

Csharp相关问答推荐

C# Json重新初始化动态类型

为什么我在PuppeteerSharp中运行StealthPlugin时会出现错误?

C#将参数传递给具有变化引用的变量

在C#中使用in修饰符

如何保持主摄像头视角保持一致?

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

实体框架核心上是否支持使用NPGSQL的字符串聚合?

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

如何在Windows 11任务调度程序中每1分钟重复一次任务?

JSON空引用异常仅在调试器中忽略try-Catch块,但在其他上下文中捕获得很好

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

使用泛型可空类实现接口

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

为什么我可以用硬编码的集合而不是变量来设置没有setter的IList属性的值?

为值对象编写自定义JsonConverter

如何在onNext之前等待订阅者完成?

为什么我不能从我的异步任务方法中返回异步任务方法?

如何将 colored颜色 转换为KnownColor名称?

使用C#12中的主构造函数进行空判断

ASP.NET核心MVC|如何在控制器方法之间传递值