2013-07-25 64 views
9

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

我提交的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方法中使用物化对象做某事时,“值”的值是123.45。

如果我提交2个或更少的小数位(即123.4或123.45),则按照预期将值解序列化,但是如果我提交了2个以上的小数位(即123.456或123.4567等),则该值总是被反序列化至123.45。

任何人碰到这个问题?有什么建议?

回答

16

我设法排序了这一点。

到底问题是由事实,即培养物被设置造成哪些包含货币数字格式。货币数字格式指定s的小数位数应该用于十进制值。

为了解决这个问题我现在设置的WebAPI JSON序列化文化的CultureInfo.InvariantCulture一个新的实例在Global.ascx.cs像这样:

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

这意味着,十进制值能有什么多达5位小数。