GWT的JSONParser为数字生成了错误的值

时间:2010-03-25 18:30:35

标签: javascript json gwt eval

我正在使用GWT并从返回DataTable的ASP.NET Web服务方法解析JSON结果。我可以将结果解析为JSONvalue / JSONObject就好了。我遇到的问题是我在DECIMAL(20,0)中的列和被解析为JSON的值并不准确。为了演示不需要WS调用,在GWT中我把它放在一起:

String jsonString = "{value:4768428229311981600}";
JSONObject jsonObject = JSONParser.parse( jsonString ).isObject();
Window.alert( jsonObject.toString() );

这反过来警告:

{"value":4768428229311982000}

我理解GWT的JSONParser只是使用eval()来进行解析,因此这是我从未意识到的某种数字/精度问题。我承认我不使用JavaScript中的数字,我可以通过更改.NET WebService将此列作为字符串返回来解决这个问题,但我真的不愿意这样做。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我前面回答过一个类似的问题 - Arbitrary precision in GWT

更新的答案是BigDecimal支持看起来跟踪GWT 2.1

在此之前,如果您不需要使用数字客户端进行计算,我建议将它们作为字符串传递。

此外,查看您的示例,您可以将它们作为字符串传输,也可以使用模拟的GWT java.lang.Long。

最后一个问题,您可以尝试使用BigDecimal GWT-Math的svn版本 - 将java文件放入jar中并不是那么糟糕(它不需要编译,因为它是所有的emul代码)

如果你走这条路,你仍然需要将数字作为JSON字符串传递,但你可以执行有意义的数学运算。

答案 1 :(得分:1)

嗯,Javascript只使用普通的IEEE 754 64位浮点,因此存在固有的精度限制。该语言不支持任意大小的整数(或者,实际上,任何纯整数)。当您需要在Javascript中操作值时,您将不得不使用字符串表示,并且希望您不必进行任何数学运算。

编辑:我之前看过这个:http://www-cs-students.stanford.edu/~tjw/jsbn/

如果您不需要对数字进行大量操作,这似乎是一个相当多毛的解决方案,但它可能值得一看。那个想法可能没有那么雄心勃勃的变化。

在任何情况下,除非您还使用这样的库连接变体JSON解析器来构造数值,否则这不会帮助您直接解释JSON。