2013-07-25 92 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位小數。