私の目標は、JSON形式を使用して、データの任意の行を同期させることです。 私は行のための正確なスキーム(一般的な同期メソッド)を知らないので、私のデータモデルは明らかに "オブジェクト"に依存しなければなりません。だからJavaで私はMap<String,Object>
の配列をサーバーと同期させることになります。 JSONにmoshiでデシリアライズするときのlong値とdouble値の区別方法は?
翻訳などの行は、これまでのところは良い
{{"string":"stringvalue"},{"double1":1234.567},{"double2":1234.0},{"long":1234}}
のようなものを与えないだろう - 何の問題モシで - すべてが期待どおりに動作します。
問題:moshiでJSONを逆シリアル化しようとすると、「long」メンバーのdouble値が返されます。モシはすべての数字をダブルに変換します。しかし残念ながら、すべての数値が安全にダブルに変換されるわけではありません。非常に大きな整数(別名ロング)は、倍精度の制限された精度に問題があります。また、丸め効果も存在する可能性があります。
私はmoshiで問題をオープンしましたが、残念ながら閉鎖されました。多分私は十分にはっきりしていなかったでしょう。 (Issue 192)
JSONには整数のみの数字と文字列の概念がありません。しかし、上記の例の "double2"の微妙な詳細は、私の問題の解決策につながるかもしれません。
数字に小数点が含まれていない場合は整数で、長さに変換する必要があります。
longは無損失で倍精度に変換できないため、値がdoubleに変換される前にパーサをインターセプトするメソッドが必要です。しかし、それを行う方法?
モシはJsonAdaptersのこの便利な考え方を持っている - 残念ながら、私は現在、私はこのケースでは、それらを使用する方法を見ていない:
私は、生成をキャストすることはできませんので、このようなJsonAdapterの入力型がオブジェクトでなければならないであろう2倍から長い。だから私は彼が任意の値を変換する前にパーサーを傍受する必要があります。
しかし、そこから複数のタイプを返す方法はありますか? (私はそこからString、Double、Longを返さなければならない、あるいは入力を数字だけに制限することができれば、少なくともLongsまたはDoubleを返さなければならない)。
私のバックエンドはPHPで書かれ、所望の出力:整数は小数点なしで書かれています。)