【问题标题】:How to display decimal values in swagger correctly如何正确地大摇大摆地显示十进制值
【发布时间】:2019-03-12 13:37:41
【问题描述】:

我们使用 swagger 来测试我们的其余 API。我有一个带有以下值的 json 对象:

...
   "MyValue" : 243400.000000
}

但是,当它通过 swagger 显示时,它显示为:

...
   "MyValue" : 243400
}

在我的控制器中,我在 return 语句上设置了一个断点,我可以在 dResult 中验证“MyValue”是 243400.000000,但大摇大摆的显示并未反映这一点。控制器代码如下:

 ...
 var dresult = JSON.JsonConvert.DeserializeObject(result, new JSON.JsonSerializerSettings
        {
            FloatParseHandling = JSON.FloatParseHandling.Decimal
        });

 return Request.CreateResponse(HttpStatusCode.OK, dresult, JsonMediaTypeFormatter.DefaultMediaType);

这可能是一个招摇的配置问题吗?我还没有找到任何指向它的东西。任何帮助将不胜感激。

原始的招摇配置

 using System.Web.Http;
 using WebActivatorEx;
 using MyService.WebApi;
 using Swashbuckle.Application;
 using Swashbuckle.Swagger;

 [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

 namespace MyService.WebApi
 {
    public class SwaggerConfig
    {
       public static void Register()
       {
          var thisAssembly = typeof(SwaggerConfig).Assembly;

         GlobalConfiguration.Configuration 
            .EnableSwagger(c =>
                {
                    c.SingleApiVersion("v1", "MyService.WebApi");
                    c.IncludeXmlComments(string.Format(@"{0}\bin\MyService.WebApi.XML", System.AppDomain.CurrentDomain.BaseDirectory));                        
                    c.UseFullTypeNameInSchemaIds();
                    c.DescribeAllEnumsAsStrings();
                })
            .EnableSwaggerUi(c =>
                {
                    c.DisableValidator();
                });
       }
   }
}

【问题讨论】:

  • 将其包含在您的招摇配置中并检查 config.MapType(() => new Schema { type="number", format="decimal" });
  • @TonyTom - 我添加了您建议和测试的行...仍然不显示十进制值。
  • 您能否在问题中也包含您的招摇配置?
  • c.MapType(() => new OpenApiSchema { Type = "number", Format = "decimal" });

标签: c# swagger


【解决方案1】:

我想你可能想错了!

我可以看出,如果您关心精确的十进制表示,却无法在您用于测试 API 的工具中看到精确的十进制表示,这将是令人沮丧的。

但是……

您最终将如何使用发送的 JSON?假设您在 JavaScript 应用程序中使用它,并且要将 API 响应反序列化为 JavaScript 对象。但在这种情况下,"MyValue": 243400.000000 的值将反序列化为 JavaScript 编号。这是问题的根源,因为 swagger-ui - 这是 Swashbuckle.AspNetCore 用于其 UI 的内容 - 此时只知道它是一个数字:它正在显示您的 API JSON 反序列化到的内容,以及 243400.000000 和 243400 反序列化到相同的值。

这些都是我认为可能是更潜在问题的症状。如果您担心绝对准确地匹配某个十进制表示,JavaScript Number 不是保存值的最佳位置(如在this answer 中提到的相关 SO 问题)。如果您关心绝对正确地表示小数,您可能应该寻找一个严格的 JavaScript 十进制支持库,并将这些值从您的 API 作为字符串发送(然后您将客户端转换为十进制库提供的十进制对象你用)。 (编辑:或者可能按原样发送值,但实现一个自定义 JSON 反序列化器,将它们转换为真正的十进制对象?)

这里有一个链接到someone else 有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多