Go正确编组float64到JSON吗?

时间:2013-11-20 14:59:26

标签: json go dart marshalling unmarshalling

使用go1.1.2 Win64,我有一个Go程序,它“编组”一个包含float64的结构。当float64的值不是整数时,例如。 1234.44,然后它被“编组”为浮点数(json.Marshal)。然而,当它是一个整数时,例如。 “1234.00”它被编组为整数“1234”。当我在另一端(Dart)收到它时,Dart(30188)将整数视为整数(在地图中 - JSON.decode)。因此,当float(double)数据的表示不包含小数点时,Dart程序将中止,并且我尝试将其作为double从地图“提取”。

这显然可以通过多种不同的方式解决(例如转换为整数然后转换回浮点数),但是我想知道是否还有另一种(更好的)方法来处理这种情况。

还有另一种更好的方法来处理这个问题,而不是将float64转换为整数吗?

2 个答案:

答案 0 :(得分:6)

JSON,就像Javascript一样,在整数和数字之间没有区别。

如果Dart将1234.001234区别对待,那么它会对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。这样,您可以确保您的数字始终用小数点编组。

Playground

上的工作示例

答案 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,但我确信这是有充分理由的。