2013-11-20 6 views
5

go1.1.2 Win64を使って、私は "marshal"がfloat64を含む構造体のGoプログラムを持っています。 float64の値が整数でない場合など。 1234.44であれば、浮動小数点数として "マーシャル"されます(json.Marshal)。しかし、それは整数である。 「1234.00」は整数「1234」としてマーシャリングされます。それを他端(Dart)で受け取ったDart(30188)は、整数を整数として扱います(マップ - JSON.decode)。したがって、float(double)データの表現に小数点が含まれていない場合、Dartプログラムは異常終了し、マップからdouble型として抽出しようとします。float64をJSONに正しくマーシャリングしますか?

これは、明らかに、整数に変換してからfloatに変換するなど、さまざまな方法で解決できますが、この状況を処理する別の(より良い)方法があるかどうかは疑問でした。

float64を整数に変換するよりも、これを処理する別の方法がありますか?

答えて

5

JSONは、Javascriptと同じように、整数と数値の間で違いはありません。

ダートで1234.001234とは異なる方法で処理する場合は、JSON specificationでサポートされていない値についての前提が設定されています。代わりに、

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タイプを使用することができます:Goは確かに元帥が正しくのfloat64んが

、ダートの前提で問題を歩き回るの一つの方法は、あなた自身のタイプにMarshaler interfaceを実装することですfloat64の、あなたがマーシャリングする構造体に。この方法で、あなたの数字が常に小数点でマーシャルされるようにすることができます。 Playground

+0

ありがとうございます。私はこれをダーツの最後に解決すべきだと思う。 Dartではdouble型に整数を代入することはできません。これは私に異常なように見えますが、私は少なくとも理論的な観点からは間違っていることを認めます(キャストアップ、キャストダウンなど)。私が現在持っている解決策は次のとおりです: "double dAcctBal =(mAcctData ['D_AcctBal'] num)/ 1;" (ここで、mAcctDataは、 "D_AcctBal"が整数であるか、または整数であるかに応じて2倍になるマップです)。私にこの解決策は、ビットのハックが表示されますが、整数が直接ダブルに割り当てることができない場合は? –

+0

はい、ダーツの最後で解決するのが最善であると私は同意します。もし私が知っていれば、私は喜んであなたにそのような解決策を与えるでしょうが、ダーツの私の経験は非常に限られています。たぶん知識が豊富な人は、もっと慣れ親しんだダーツのソリューションを見つけることができます。 – ANisus

+0

JSONは数値リテラルのセマンティクスを指定していないので、整数より倍数を使用するのは正しいです。ダーツには2つの数値タイプがあります。小数点または指数部を含むものはすべてdouble型でなければならず、その他はすべて整数として解析されます。これはDartでは倍精度よりも精度が高くなります。これによりJSON番号からできるだけ多くの情報が保持されます。すべての数字を倍にするには、手動で.toDoubleを使用する必要があります。 – lrn

1

以下に例を作業する

は(私には)ソリューションであることが表示されます。整数メソッドtoDouble()は "num"(またはその逆)でも機能します。 jsonとDartによってdoubleまたはintのいずれかと解釈される金銭的価値を扱う場合、 "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(); 

ダートが整数の直接割り当てが倍増することはできませんなぜ私は知らないが、私は確かに良い理由がある。

+0

非常に良い理由です。 Dartの型アノテーションはオプションで、アサーションとして扱われます(プロダクションモードでは無視されます)。これは、変数に型がないことを意味します。したがって、doubleとして宣言された変数に整数を代入すると、その変数がdouble( "double x")またはdynamic( "x"これにより、暗黙の変換が防止されます。チェックモードでは、代入がチェックされ、 'int'は 'double'のサブタイプではないので、型アサーションは失敗します。あなたは明示的なn.toDouble()をしなければなりません。 – lrn

+0

@lrn:説明をありがとう。私は "それを勉強すべき"。それは私に困惑しましたが、私はいくつかの要因が関わっていると思います。今のところ私はこの間に移動してきたが、私の小さな「解決策」はOKだと思う。 (numで).toDouble()はあまり面倒ではありませんが、実用的な観点からは、doubleの範囲で完全に互換性のあるintをdoubleに直接割り当てることはできません。この小さな問題が比較的簡単なので、いくつかの要因が関係しています(おそらく間接的にJSと推測します)。 –

関連する問題