C# .NET';s JavaScriptSerializer.Deserialize()忽略JSON中数字的小数点

C# .NET';s JavaScriptSerializer.Deserialize()忽略JSON中数字的小数点,c#,.net,json,javascriptserializer,C#,.net,Json,Javascriptserializer,我正在使用JavaScriptSerializer.Deserialize()从JSON文件获取数据。 但是它忽略了小数点,尽管在值上使用.GetType()返回System.decimal 这是C代码: 我尝试这样做:Console.WriteLine(“{0}{1}”、dic[“num”].GetType()、dic[“num”]) 然后得到:System.Decimal 314 注:正如你所看到的,我是.NET新手。你一定在做一些你没有告诉我们的事情 以下是完整的工作代码: String

我正在使用
JavaScriptSerializer.Deserialize()
从JSON文件获取数据。
但是它忽略了小数点,尽管在值上使用
.GetType()
返回
System.decimal

这是C代码:

我尝试这样做:
Console.WriteLine(“{0}{1}”、dic[“num”].GetType()、dic[“num”])
然后得到:
System.Decimal 314


注:正如你所看到的,我是.NET新手。

你一定在做一些你没有告诉我们的事情

以下是完整的工作代码:

String json = " { \"num\": 3.14 }";
JavaScriptSerializer jss = new JavaScriptSerializer();
Dictionary<string, object> dic = jss.Deserialize<Dictionary<string, object>>(json);

String test = String.Format("{0} {1}", dic["num"].GetType(), dic["num"]);
String json=“{\'num\”:3.14}”;
JavaScriptSerializer jss=新的JavaScriptSerializer();
Dictionary dic=jss.Deserialize(json);
String test=String.Format(“{0}{1}”,dic[“num”].GetType(),dic[“num”]);

在IIS/was中托管的WCF服务中,我遇到了同样的问题,我使用这个类来反序列化一些JSON。在将服务从一台生产服务器移动到另一台生产服务器(其中区域性设置不同)后出现问题

根本问题是不同的。即使运行WCF服务的应用程序池用于具有正确区域性的标识,但在服务器重新启动后,运行此服务的进程立即被证明具有错误的标识或区域性。我们仍然没有弄清楚问题到底出在哪里,但这可能是由于线程池污染(返回到线程池的线程不会重置其区域性)或AppFabric autostart中的错误造成的。。。也许吧


在任何情况下,原始文章中的问题都是由于错误的CurrentCulture,以及JavaScriptSerializer的错误实现(JSON规范不是要求小数点对应小数吗?)。小数不能与不兼容的CurrentCulture正确反序列化。

这可能是使用Console.WriteLine显示值的方式。首先尝试将它赋给一个变量,看看它是否有正确的值。@Rui:不太可能。如果没有其他格式说明符,则应正确打印浮点数(根据当前的
CultureInfo
,使用分隔符)<另一方面,code>JavaScriptSerializer
应该使用
InvariantCulture
,所以这看起来很奇怪。在我的机器上工作:-/它不应该工作,但尝试
{“num”:3,14}
。不,它会与
3,14
崩溃。你说JSON解释随语言环境而变化?但是JSON规范不依赖于任何语言环境,小数总是使用句点。我也有同样的问题,它似乎与语言环境有关。我现在正在努力把它弄清楚。不,我实际上复制了你的代码,我仍然得到
System.Decimal 314
。我在MacOS上使用MonoDevelop,这是Unity附带的版本。也许这是个问题?(我正在构建一个控制台应用程序来测试)“MacOS上的MonoDevelop”啊,这是你没有告诉我们的部分。对不起,我的衣柜里确实有一个骨架。那么这是不可信的吗?我不知道它是否可信。但显然它不起作用。
{ "num": 3.14 }  
String json = " { \"num\": 3.14 }";
JavaScriptSerializer jss = new JavaScriptSerializer();
Dictionary<string, object> dic = jss.Deserialize<Dictionary<string, object>>(json);

String test = String.Format("{0} {1}", dic["num"].GetType(), dic["num"]);