为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2021-06-30 18:14:54
使用 go1.1.2 Win64,我有一个 Go 程序,它“编组”了一个包含 float64 的结构。当 float64 的值不是整数时,例如。1234.44,然后它被“编组”为浮点数(json.Marshal)。然而,当它是一个整数时,例如。“1234.00”它被编组为一个整数“1234”。当我在另一端 (Dart) 收到它时,Dart (30188) 将整数视为整数(在地图中 - JSON.decode)。因此,当浮点数(双精度数)数据的表示不包含小数点时,Dart 程序将中止,并且我尝试将其从地图中“提取”为双精度数。这显然可以通过多种不同的方式解决(例如,转换为整数,然后转换回浮点数),但是我想知道是否有另一种(更好的)方法来处理这种情况。有没有比将 float64 转换为整数更好的方法来处理这个问题?
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

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


如果 Dart 的处理方式1234.00与 不同1234,那么它正在对JSON 规范不支持的值做出假设。


虽然 Go 确实正确地封送了float64,但解决 Dart 假设问题的一种方法是在您自己的类型上实现Marshaler 接口:


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。通过这种方式,您可以确保您的数字始终使用小数点进行编组。


查看完整回答
反对 回复 2021-07-12
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

以下似乎是(对我而言)解决方案。整数方法 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,但我确信这是有充分理由的。


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信