[解決済み] Gson が整数を浮動小数点数で表現するのを防ぐ方法
2023-07-07 17:38:01
質問
Gsonで文字列をjsonに変換しようとすると、おかしな挙動をします。以下のコードは、文字列のドラフトをjsonレスポンスに変換します。gsonがすべての整数値に'.0を追加するのを防ぐ方法はありますか?
ArrayList<Hashtable<String, Object>> responses;
Type ResponseList = new TypeToken<ArrayList<Hashtable<String, Object>>>() {}.getType();
responses = new Gson().fromJson(draft, ResponseList);
draft:
[ {"id":4077395,"field_id":242566,"body":""},
{"id":4077398,"field_id":242569,"body":[[273019,0],[273020,1],[273021,0]]},
{"id":4077399,"field_id":242570,"body":[[273022,0],[273023,1],[273024,0]]}
]
responses:
[ {id=4077395.0, body=, field_id=242566.0},
{id=4077398.0, body=[[273019.0, 0.0], [273020.0, 1.0], [273021.0, 0.0]], field_id=242569.0},
{id=4077399.0, body=[[273022.0, 0.0], [273023.0, 1.0], [273024.0, 0.0]], field_id=242570.0}
]
どのように解決するのですか?
Gsonに文字列からオブジェクトへのマップのリストを探していることを伝えていますが、これは本質的にオブジェクトの型について最善の推測をするように言っているのです。そのため JSON は整数と浮動小数点のフィールドを区別しないので Gsonは数値フィールドのデフォルトをFloat/Doubleにしなければなりません。
Gsonは基本的に、データをどのようにパースするかを決定するために、入力したいオブジェクトの型を検査するように作られています。 ヒントを与えない場合、あまりうまく動作しないでしょう。 1つの選択肢は、カスタムJsonDeserializerを定義することですが、より良い方法は、HashMapを使用せず(そして間違いなくHashtableを使用しないでください!)、代わりにGsonに期待しているデータのタイプに関するより多くの情報を与えることでしょう。
class Response {
int id;
int field_id;
ArrayList<ArrayList<Integer>> body; // or whatever type is most apropriate
}
responses = new Gson()
.fromJson(draft, new TypeToken<ArrayList<Response>>(){}.getType());
繰り返しになりますが、Gsonの全体的なポイントは、構造化されたデータを構造化されたオブジェクトにシームレスに変換することです。 オブジェクトのマップのリストのような、ほぼ未定義の構造を作成するように依頼した場合、Gson の全体的なポイントを破っていることになり、もっと単純な JSON パーサーを使用したほうがよいでしょう。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
配列定数は初期化子でのみ使用可能です。
-
アノテーション「@Retention」の役割
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] アプリケーションからAndroidのWebブラウザでURLを開くにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
無効な文字定数
-
API の戻り値を処理するために ResponseEntity を使用する
-
Java基礎編 - オブジェクト指向
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み】JSONをMapに変換する。