猿问

Go 是否正确地将 float64 编组为 JSON?

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

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

有没有比将 float64 转换为整数更好的方法来处理这个问题?


富国沪深
浏览 289回答 2
2回答

拉风的咖菲猫

JSON 与 Javascript 一样,在整数和数字之间没有区别。如果 Dart 的处理方式1234.00与 不同1234,那么它正在对JSON 规范不支持的值做出假设。虽然 Go 确实正确地封送了float64,但解决 Dart 假设问题的一种方法是在您自己的类型上实现Marshaler 接口:type Number float64func (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。通过这种方式,您可以确保您的数字始终使用小数点进行编组。

繁星淼淼

以下似乎是(对我而言)解决方案。整数方法 toDouble() 也适用于“num”(反之亦然)。在我看来,在处理可能被 Dart 解释为 double 或 int 的 json 和货币值时,有必要使用“as num”,然后使用内置方法 toDouble()。示例(去):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,但我确信这是有充分理由的。
随时随地看视频慕课网APP

相关分类

Go
我要回答