我在使用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
}
我通过JQueryajax请求提交数据,但在提交前检查chrome-dev工具中的值时,以及在fiddler中检查值时,我可以看到发布的值与我预期的完全一样。
当使用Post
方法中的实体化对象时,"value"的值为123.45。
如果我提交了2位或更少的小数位数(即123.4或123.45),则该值会按预期进行反序列化,但如果我提交的小数位数超过2位(即123.456或123.4567等),则值总是会被反序列化为123.45。
还有人遇到这个问题吗?有什么建议吗?
我设法解决了这个问题。
最终,问题是由于设置了包含货币编号格式的区域性。货币数字格式指定应用于十进制值的小数位数。
为了解决这个问题,我现在将WebApi JSON序列化程序区域设置为Global.ascx.cs
中CultureInfo.InvariantCulture
的新实例,如下所示:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty) {
NumberFormat = new NumberFormatInfo {
CurrencyDecimalDigits = 5
}
};
这意味着十进制值最多可以有5位小数。