Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否正确地将float64封送到JSON?_Json_Go_Dart_Marshalling_Unmarshalling - Fatal编程技术网

是否正确地将float64封送到JSON?

是否正确地将float64封送到JSON?,json,go,dart,marshalling,unmarshalling,Json,Go,Dart,Marshalling,Unmarshalling,使用go1.1.2Win64,我有一个Go程序,它“封送”是一个包含float64的结构。当float64的值不是一个整数(如1234.44)时,它会被“封送”为一个float(json.marshal)。然而,当它是一个整数时,例如“1234.00”,它被编组为整数“1234”。当我在另一端(Dart)接收到它时,Dart(30188)将整数视为整数(在map-JSON.decode中)。因此,当float(double)数据的表示形式不包含小数点时,Dart程序将中止,我尝试将其作为doub

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

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


还有比将float64转换为整数更好的方法吗?

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

如果Dart对
1234.00
的处理方式与
1234
不同,则Dart是在对不受支持的值进行假设

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

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


关于

的工作示例(在我看来)以下就是解决方案。integer方法toDouble()也适用于“num”(反之亦然)。在我看来,当使用json和货币值(Dart可以将其解释为double或int)时,有必要使用“as num”,然后使用内置方法toDouble()

示例(Go):

示例(Dart):


我不知道为什么Dart不允许将整数直接赋值为双精度,但我确信这是一个很好的理由。

谢谢您的解决方案。我认为这应该在省道端解决。似乎无法将整数指定给双精度省道。在我看来,这似乎是一种反常现象,但我承认,至少从理论角度来看,我是错的(向上看,向下看,等等)。我目前的解决方案如下:“double dAcctBal=(mAcctData['D_AcctBal']as num)/1;”(其中mAcctData是映射,其中“D_AcctBal”可以是整数,也可以是双精度,具体取决于它是整数)。这个解决方案对我来说似乎有点困难,但如果一个整数不能直接分配给一个双精度?是的,我同意最好在省道端解决它。如果我知道的话,我也很乐意给你这样一个解决方案,但我对Dart的经验非常有限。也许有更多知识的人可以找到更惯用的Dart解决方案。JSON没有指定其数字文本的语义,因此使用双精度比整数更不正确。Dart有两种数字类型。任何包含小数点或指数部分的内容都必须是双精度的,其他内容都被解析为整数,在Dart中,它比双精度提供了更高的精度。这将尽可能多地保留JSON编号中的信息。如果您希望所有数字都是双精度的,则需要手动使用.toDouble。@Irn虽然使用适合您的int、double、string等来存储JSON数字的信息是正确的,但由于小数点的原因,假定1234.0为双精度是错误的。1234.0的值和类型(数字)均等于1234。小数点不包含需要保存的信息;这样的假设会引起问题。然而,如果Dart也将1234.0解析为
int
(我希望如此),那么int类型将简单地声明没有小数,这将没有任何类型假设。这是一个很好的理由。Dart中的类型注释是可选的,它们被视为断言(在生产模式中被忽略)。这意味着变量没有类型,因此无论变量是声明为double(“double x”)还是仅声明为dynamic(“var x”),为声明为double的变量分配整数的工作方式都必须相同。这可以防止任何隐式转换。在检查模式下,将检查赋值,由于“int”不是“double”的子类型,因此类型断言失败。您必须执行显式的n.toDouble()。@lrn:谢谢您的解释。我“应该”研究一下。这让我感到困惑,但我想其中有几个因素。虽然我现在已经从这开始了,但我认为我的小“解决方案”是可以的。(作为num.toDouble())不是很繁重,但是,从实际的角度来看,我确实觉得奇怪,在范围上与double完全兼容的int不能直接分配给double。尽管这个小问题相对简单,但其中涉及到一些因素(我想包括JS——可能是间接的)。
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();