使用go1.1.2 Win64,我有一个Go程序,它“编组”一个包含float64的结构。当float64的值不是整数时,例如。 1234.44,然后它被“编组”为浮点数(json.Marshal)。然而,当它是一个整数时,例如。 “1234.00”它被编组为整数“1234”。当我在另一端(Dart)收到它时,Dart(30188)将整数视为整数(在地图中 - JSON.decode)。因此,当float(double)数据的表示不包含小数点时,Dart程序将中止,并且我尝试将其作为double从地图“提取”。
这显然可以通过多种不同的方式解决(例如转换为整数然后转换回浮点数),但是我想知道是否还有另一种(更好的)方法来处理这种情况。
还有另一种更好的方法来处理这个问题,而不是将float64转换为整数吗?
答案 0 :(得分:6)
JSON,就像Javascript一样,在整数和数字之间没有区别。
如果Dart将1234.00
与1234
区别对待,那么它会对JSON specification不支持的值进行假设。
虽然Go确实正确编组了float64,但解决Dart假设问题的一种方法是在你自己的类型上实现Marshaler interface:
type Number float64
func (n Number) MarshalJSON() ([]byte, error) {
// There are probably better ways to do it. It is just an example
return []byte(fmt.Sprintf("%f", n)), nil
}
然后你可以在你将要使用的结构中使用自己的Number
类型,而不是float64
。这样,您可以确保您的数字始终用小数点编组。
答案 1 :(得分:1)
以下似乎是(对我而言)解决方案。整数方法toDouble()也适用于“num”(反之亦然)。在我看来,当使用可以被Dart解释为double或int的json和货币值时,必须使用“as num”然后使用内置方法toDouble()。
示例(Go):
type cuAcctRow struct {
.....
D_AcctBal float64
.....
}
if baJsAcctDet, oOsError = json.Marshal(uAcctRow); oOsError != nil {
示例(飞镖):
Map mAcctData = json.parse(sResponse);
double dAcctBal = (mAcctData['D_AcctBal'] as num).toDouble();
我不知道为什么Dart不允许将整数直接赋值为double,但我确信这是有充分理由的。