【问题标题】:WebAPI, JSON.Net and losing decimal precisionWebAPI、JSON.Net 和丢失小数精度
【发布时间】:2013-07-25 05:05:12
【问题描述】:

我在使用 WebAPI 和 JSON.Net 时遇到了一个奇怪的问题。当反序列化已提交给我的 API 的 JSON 时,我似乎失去了精度!我将小数点提交到小数点后 3 位,但是当值在我的对象中实现时,它只保留到小数点后 2 位!

我提交的 JSON 如下所示:

{
    id: 1,
    name: 'mock data',
    value: 123.456
}

这绑定到一个看起来像这样的类:

public class MockObject {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Value { get; set; }
}

为了完整起见,这基本上是我的 WebAPI 方法的样子:

public HttpResponseMessage Post (MockObject data) {
    // do something with the value here and return the relevant response
}

我通过 JQuery ajax 请求提交数据,但我可以看到发布的值与我在提交之前检查 chrome 开发工具中的值时所期望的完全一样,一旦它们“通过网络”在提琴手中检查”。

当它在Post 方法中对物化对象做某事时,“Value”的值为 123.45。

如果我提交 2 个或更少的小数位(即 123.4 或 123.45),则该值会按预期反序列化,但是如果我提交超过 2 个小数位(即 123.456 或 123.4567 等),则该值总是会反序列化为123.45.

还有其他人遇到过这个问题吗?有什么建议吗?

【问题讨论】:

  • 我有一个类似的问题,我传递小于 1 的数字,即 0.83255669,当它序列化 JSON 时,它变为 1 并说它是长的。不过,您的解决方案似乎对我不起作用。有什么想法吗?

标签: c# asp.net-web-api json.net


【解决方案1】:

我设法解决了这个问题。

最终问题是由于设置了包含货币数字格式的文化这一事实引起的。货币数字格式指定应该用于十进制值的小数位数。

为了解决这个问题,我现在将 WebApi JSON 序列化程序文化设置为 Global.ascx.cs 中的 CultureInfo.InvariantCulture 的新实例,如下所示:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty) {
    NumberFormat = new NumberFormatInfo {
        CurrencyDecimalDigits = 5
    }
};

这意味着十进制值最多可以有 5 个小数位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多