2016-09-23 13 views
1

私の目標は、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で書かれ、所望の出力:整数は小数点なしで書かれています。)

答えて

1

私はMoshiソースコードを変更しなければできません。 JSON文字列ソースは、すべての数値をdoubleに変換するJsonReaderを通過します。すべてのサブクラスがパッケージ保護されているので、この動作を変更する方法を見つけることができませんでした。

関連する問題