我们使用swagger测试其余的API。我有一个返回以下值的json对象:
...
"MyValue" : 243400.000000
}
但是,当它通过招摇显示时,它显示为:
...
"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();
});
}
}
}
答案 0 :(得分:1)
我认为您可能会以错误的方式考虑这个问题!
如果您关心精确的十进制表示形式,那么我将无法在用于测试API的工具中看到确切的十进制表示形式。
但是...
您最终将如何使用发送的JSON?大概是在JavaScript应用程序中使用它,然后将API响应反序列化为JavaScript对象。但是在这种情况下,您的"MyValue": 243400.000000
值将反序列化为JavaScript编号。这是问题的根源,因为swagger-ui(这是Swashbuckle.AspNetCore用于其UI的用途)目前仅知道它是一个数字:它显示了将您的API JSON反序列化的内容,并且243400.000000和243400反序列化为相同的值。
这些都是我认为可能是更根本的问题的所有症状。如果您担心绝对精确地匹配某个十进制表示形式(如在this answer中也提到了相关的SO问题),那么JavaScript数字不是保存值的最佳位置。如果您关心绝对正确地表示小数,则应该考虑使用JavaScript的严格十进制支持库,并将API中的这些值作为字符串发送(然后将客户端转换为十进制库提供的十进制对象你用)。 (编辑:或按原样发送值,但实现自定义JSON解串器,将其转换为真正的十进制对象...)
这里有一个与someone else相同的问题的链接。