私はGsonを使用していますが、オブジェクトのシリアル化で問題が発生しました:
java.lang.IllegalArgumentException: NaN is not a valid double
value as per JSON specification. To override this behavior,
use GsonBuilder.serializeSpecialFloatingPointValues() method.
at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:296)
...
Gsonに問題のあるクラス名/フィールド名を出力させる方法はありますか? 提案どおりにメソッドを使用できますserializeSpecialFloatingPointValues()
が、理想的には、オブジェクトのどこに NaN があるかを理解したいと考えています。
- - - - アップデート - - - - - - - -
これを丹念に踏んだ後、原因は初期化されていないダブルだと思います。私のセットアップは次のようになります。
public class Foo {
private double price;
}
String jsonFromNet = ...;
Foo foo = Gson.fromJson(jsonFromNet);
Gson.toJson(foo, Foo.class); <-- throws the exception
私のAPIから返されたjsonには属性「価格」が含まれていないため、メンバー変数「d」は初期化されていないと思います。シリアル化しようとすると、gson がエラーをスローします。
シリアル化の前に「price」に明示的な値を指定した場合、またはたまたま api json 応答に含まれていた場合、すべて正常に動作します。
また、「価格」を double から float に変更しても、初期化されていない状態は問題ないようです。
ここで GsonBuilder.serializeSpecialFloatingPointValues() を調べます。この状態で double がどのようにシリアル化されるのか疑問に思います。デフォルト値はゼロか何かで問題ありません。
ありがとう